PDA

View Full Version : اجراي فرم‌هاي يك برنامه اجرايي از درون برنامه ديگر



سعید صابری
چهارشنبه 27 آبان 1388, 10:17 صبح
سلام دوستان

من يه جايي ديدم يه نفر با دستور findwindow و چند تا كد ديگر فرم‌هاي برنامه‌هاي اجرايي كه با دلفي نوشته شده بودند اجرا مي كرد مثلا اگر برنامه فرم اصليش براي ورود رمز مي خواست اون ميومد فرم 2 اون برنامه را اجرا مي كرد. ممنون ميشم اگر كسي در اين مورد اطلاعاتي داره در اختيار من بزاره.

Mahmood_M
چهارشنبه 27 آبان 1388, 12:01 عصر
با استفاده از FindWindow می تویند Handle یک پنجره یا کلا یک WinControl رو بدست بیارید ...
با داشتن Handle و با استفاده از توابعی مثل ShowWindow می تونید پنجره ی مربوط به اون هندلی که بدست اومده رو نمایش بدید ...

سئوالتون دقیقا مربوط به کدوم قسمت هست ... ؟

...

tdkhakpur
چهارشنبه 27 آبان 1388, 12:26 عصر
من يه جايي ديدم يه نفر با دستور findwindow و چند تا كد ديگر فرم‌هاي برنامه‌هاي اجرايي كه با دلفي نوشته شده بودند اجرا مي كرد
آنطور كه شما توضيح داديد نيست ولي براي اينكه فرم يك برنامه را با توجه به findwindow پيدا كرده و اجرا نمود بستگي به اين دارد كه فرم ايجاد و handle براي فرم تعيين شده باشد. در غير اينصورت شايد غير ممكن باشد.

سعید صابری
چهارشنبه 27 آبان 1388, 18:18 عصر
منظور من اينه يه برنامه دلفي مثلا 3 فرم دارم روي هارد است اصلا نيازي به اجراي برنامه هم نيست اسم فرم دوم يا سوم ميداد آن فرم اجرا ميشد. FINDWINDOW و چند تا دستور ديگر بود

merced
چهارشنبه 27 آبان 1388, 21:10 عصر
منظور من اينه يه برنامه دلفي مثلا 3 فرم دارم روي هارد است اصلا نيازي به اجراي برنامه هم نيست اسم فرم دوم يا سوم ميداد آن فرم اجرا ميشد. FINDWINDOW و چند تا دستور ديگر بود

سه فرم روي هارد يعني چي (سه فايل exe) ؟
اسم فرم رو مي داد آن فرم اجرا مي شد يعني كجا اسم مي داد. فرم اجرا مي شد يعني Exe اجرا مي شد؟‌

سعید صابری
پنج شنبه 28 آبان 1388, 09:10 صبح
سه فرم روي هارد يعني چي (سه فايل exe) ؟
اسم فرم رو مي داد آن فرم اجرا مي شد يعني كجا اسم مي داد. فرم اجرا مي شد يعني Exe اجرا مي شد؟‌

ممنون
نه منظورم 3 فرم در يك فايل exe .
منظورم دقيق تر بگم مثلا يه برنامه دلفي داراي سه فرم داريم اسمش ميزاريم A(بصورت فايل اجرايي)
حالا مي خوام با استفاده از يك برنامه ديگه(مثلا به نامb) هر كدام از فرمهاي برنامه a را خواستيم نمايش بديم.مثلا برنامه b برنامه a را اجرا كنه اما بجاي فرم اصلي فرم دوم نمايش بده.

ببخشيد من هميشه در دقيق گفتن منظورم مشكل دارم

tdkhakpur
پنج شنبه 28 آبان 1388, 14:16 عصر
خب بستگي دارد فايل اجرايي a چه شكلي باشد شايد توابعي داخلش export شده كه بتوان آنرا توسط LoadLibrary لود و آدرس تابع را دريافت و فرم را اجرا نمود.
به غير از اين راه امكان ندارد به جز اينكه برنامه a لود شده باشد..

merced
پنج شنبه 28 آبان 1388, 14:21 عصر
شما در فايل پروژه (dpr) اينجوري بنويس :


program Pr;

uses
Forms,
SysUtils,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2},
Unit3 in 'Unit3.pas' {Form3},
Unit4 in 'Unit4.pas' {Form4};

{$R *.res}

begin
Application.Initialize;

case StrToIntDef(ParamStr(1),0) of
1 : Application.CreateForm(TForm1, Form1);
2 : Application.CreateForm(TForm2,Form2) ;
3 : Application.CreateForm(TForm3,Form3) ;
4 : Application.CreateForm(TForm4,Form4) ;
end ;

Application.Run;
end.


موقع اجراي برنامه هم اينجوري


Project1.exe 3
اين فرم سه رو نشون ميده

سعید صابری
پنج شنبه 28 آبان 1388, 15:22 عصر
خب بستگي دارد فايل اجرايي a چه شكلي باشد شايد توابعي داخلش export شده كه بتوان آنرا توسط LoadLibrary لود و آدرس تابع را دريافت و فرم را اجرا نمود.
به غير از اين راه امكان ندارد به جز اينكه برنامه a لود شده باشد..

من خودم همه تا با چشم خودم نديده بودم باور نكردم. ولي قابل انجامه. كسي كه اينكار كرد به من گفت يك فايل اجرايي دلفي بسازم و براي ورودش رمز بزارم سورس برنامه هم را حذف كردم فقط فايل اجرايي ماند.اون فقط يه فرم دلفي ساخت يك كليد (button) گذاشت يه سري كد نوشت كه من فقط findwindow را ديدم بعد هم برنامش كه ران شد وقتي روي button كليك مي كرد فرم دوم برنامه من نمايش ميداد. متاسفانه كد در اختيار من نذاشت خيلي دوست دارم بدون چه جوري ميشه اينكار ميشه انجام داد

ممنون از حسن توجه شما

merced
پنج شنبه 28 آبان 1388, 17:02 عصر
اون يه كار غير طبيعي نكرده احتمالاً روش كار در ساخت پنجره ورود اشتباهه و با روش شما آشنا بوده و خواسته قپي بياد

مثلاً ايشون با فايل اجرايي برنامه شما رو باز كردند (SellExec ) ---- تا اينجا يه خط
اسم پنجره ورود هم كه يه بار باز كرده و ديده پس هندلش پيداش مي كنه (FindWindow) -- اين دو خط
حالا پنجره ورود رو ميبنده -- اينم سه خط
اگه روش ساخت پنجره ورود شما درست باشه برنامه بايد بسته بشه. شايد برنامه بسته نميشه و اون فرم دوم نشون داده ميشه (ايراد از برنامه شما)


فرض بر اين كه كار شما در ساخت پنجره ورود بي نقص باشه
با وقتي شما هندل يه پنجره رو داشته باشيد و اسم كنترل هاي فرم رو بدونين مي تونيد با SendMessage با اونها كار كنيد (شايد بشه با بلد نبودن اسمشون هم اين كار رو كرد نمي دونم)
مثلاً تو اديت بنويسيد و دكمه اي رو كليك كنيد (بارها بحث شده)
ايشون هم كار شاقي نكرده . همه ما مي خوايم سريع يه چيزي درست كنيم اسم Edit1 و Button1 رو عوض نمي كنيم. مخصوصاً فرم هايي كه توش زير 5 كنترل هست
چه بسا كه اين برادر بسيجي كنارتون نشسته و ديده شما اسم كنترل ها رو چي نوشتيد

خوب پس واضحه كه اين موارد ساده باعث تحير نبايد بشه .
من به عنوان يك آماتور به شما توصيه مي كنم اگه ديدين كسي كدي نوشت كه تونست كيس كامپيوتر رو چپه كنه تعجب نكنين حتماً يه كلكي تو كاره
البته اين مورد خاص نه كلكه نه چشم بندي و نه يه كار حرفه اي . يه بچه سوسول چهار خط كد نويسي ياد گرفته اومده بگه منم هم

سعید صابری
پنج شنبه 28 آبان 1388, 17:22 عصر
اون يه كار غير طبيعي نكرده احتمالاً روش كار در ساخت پنجره ورود اشتباهه و با روش شما آشنا بوده و خواسته قپي بياد

ممنون از راهنماييتون
برام مهم نيست كه چرا اينكار كرده (بخاطر خودنمايي يا ... كه فكر كنم همين دليلش بوده وگرنه كد به ما ميداد) .دلم مي خواست فقط ياد بگيرم چون زياد كنجكاوم فقط همين. فكر كنم با همين توابع كه شما فرمودن بود ولي خودم هر چي كلنجار رفتم نتونستم اين كار بكنم.

merced
پنج شنبه 28 آبان 1388, 19:47 عصر
اينم چيزي كه گفتم
با FindWindow و FindWindowEx و SendMessage كار مي كنه

عقاب سیاه
پنج شنبه 28 آبان 1388, 23:00 عصر
سلام بر همه اساتید
ببینید من چندین بار هندل فرم اول مثال بالا را بدست اوردم و اون را با هندل فرم دوم مقایسه کردم دقیقا اگر هندل فرم اول را به اضافه عدد 65536 کنیم هندل فرم دوم به دست می آید.
حالا چه طور به وسیله این هندل فرم دوم را Show کنیم و چه طور این تناسب را بین فرم ها ی برنامه به دست بیاوریم را نمی دانم و باید اساتید راهنمایی کنند!
و در ضمن در مثال بالا از طریق برنامه اول رمز عبور به Edit ارسال می شه و این مورد فقط در صورتی کاربرد دارد که رمز عبور را بدانیم در غیر این صورت .....

merced
پنج شنبه 28 آبان 1388, 23:34 عصر
و در ضمن در مثال بالا از طریق برنامه اول رمز عبور به Edit ارسال می شه و این مورد فقط در صورتی کاربرد دارد که رمز عبور را بدانیم در غیر این صورت .....

در غير اين صورت سنگ رو سنگ بند نمي شد.
شما رمز رو ندونيد و به روش به اين راحتي نرم افزار رو باز كنند

راستي جمله اولتون يعني هندل فرم اول +1 = هندل فرم دوم هميشه ممكنه صادق نباشه

عقاب سیاه
جمعه 29 آبان 1388, 07:51 صبح
در غير اين صورت سنگ رو سنگ بند نمي شد.
شما رمز رو ندونيد و به روش به اين راحتي نرم افزار رو باز كنند

راستي جمله اولتون يعني هندل فرم اول +1 = هندل فرم دوم هميشه ممكنه صادق نباشه

ببینید اگر شما هندل فرم اول را بدست بیاورید و با عدد 65536 جمع کنید هندل فرم دوم به دست می آید من 5 بار امتحان کردم

امکان دارد روزی رمز عبور برنامه خود را فراموش کنیم و نیاز داشته باشیم که فرم های دیگر را Show کنیم.

اگه ممکن خودتون هم این رابطه را با استفاده از نرم افزار زیر که هدل فرم ها را بدست می آورد چک کنید. خیلی ممنون.

سعید صابری
جمعه 29 آبان 1388, 09:42 صبح
ببینید اگر شما هندل فرم اول را بدست بیاورید و با عدد 65536 جمع کنید هندل فرم دوم به دست می آید من 5 بار امتحان کردم


لطفا به يه زبوني بگيد من حاليم شه.

ممنون

merced
جمعه 29 آبان 1388, 10:20 صبح
ببينيد اگر شما هندل فرم اول را بدست بياوريد و با عدد 65536 جمع کنيد هندل فرم دوم به دست مي آيد من 5 بار امتحان کردم

امکان دارد روزي رمز عبور برنامه خود را فراموش کنيم و نياز داشته باشيم که فرم هاي ديگر را Show کنيم.


من اينو قبول كردم و با اين نظر به اين نتيجه رسيدم كه در هر فرم بيشتر از 65536 نميشه داشت.
ضمن اينكه شما تا فرمي را Create نكني هندل نداره. من در برنامه خودم قبل از Login هيچي نميسازم (كد زير) كه به سادگي بشه با در آوردن هندل فرم لاگين رو پيچوند. چك كردم شما هم چك كن



var x : TfLogin ;
begin
Application.Initialize;

x := TfLogin.Create(Application);
x.ShowModal ;
if x.ModalResult = mrOk then begin
x.Free ;
Application.CreateForm(TfMain, fMain);
Application.Run
end
else
x.Free ;
Application.Terminate ;




لطفا به يه زبوني بگيد من حاليم شه.
ممنون

كجاش نا مفهومه

سعید صابری
جمعه 29 آبان 1388, 10:30 صبح
كجاش نا مفهومه


راستش من خيلي مبتديم.
ولي فكر كنم اين كدي كه شما لطف كردين آنتي آن چيزي كه من مي خواستم . يا من سر در نميارم.

ممنون

merced
جمعه 29 آبان 1388, 16:54 عصر
راستش من خيلي مبتديم.
ولي فكر كنم اين كدي كه شما لطف كردين آنتي آن چيزي كه من مي خواستم . يا من سر در نميارم.

ممنون

اين دو جمله رو حداقل 10 بار خوندم. :عصبانی++: آخرشم نفهميدم سواله ؟‌ جوابه ؟؟ بايد چيزي بگم ؟؟ نبايد چيزي بگم :گریه:

سعید صابری
جمعه 29 آبان 1388, 17:51 عصر
اين دو جمله رو حداقل 10 بار خوندم. :عصبانی++: آخرشم نفهميدم سواله ؟‌ جوابه ؟؟ بايد چيزي بگم ؟؟ نبايد چيزي بگم :گریه:

شما لطف داريد
درسته حق با شماست من برنامه شما را صبح دانلود كردم با اون برنامه دومي يكي بود ولي الان گرفتم برنامه دلفي بود همون چيزي كه من ميخواستم. اين ديگه جالبه.

ببخشيد

عقاب سیاه
یک شنبه 01 آذر 1388, 17:04 عصر
سلام ببخشید دیر شد:خجالت:
فکر کنم فرمایش شما کاملا صحیح باشد!
البته می خواستم بدونم می شود با دانستن هندل یک فایل ایجاد شده ولی مخفی آن را نشان داد؟

merced
یک شنبه 01 آذر 1388, 19:05 عصر
البته می خواستم بدونم می شود با دانستن هندل یک فایل ایجاد شده ولی مخفی آن را نشان داد؟
من اطلاعاتم زياد نيست ولي هندل فايل كاربرد ديگري داره. مثلاً با دانستن هندل فايل ميشه اعمال كپي حذف و خواندن و نوشتن و تغيير خواصش رو انجام داد

سوالت رو نفهميدم .

mogsam80
یک شنبه 15 آذر 1388, 20:13 عصر
سلام دوستان من می خواستم بپرسم آیا میشود یک فایل EXE را در قالب یک فرم دلفی اجرا کرد ؟
مثلا فایل PAINT ویندوز را نه بصورت اکسترنال بلکه در قالب یک فرم از برنامه کامپایل شده توسط دلفی استفاده کرد.

merced
دوشنبه 16 آذر 1388, 06:05 صبح
فكر كنم با OLE Container بشه