PDA

View Full Version : چه پنجره هایی فرزند پنجره ای خاص هستند؟



Delphi-Man
جمعه 15 آبان 1388, 09:09 صبح
سلام پنجره ای خارجی خودش رو داخل پنجره ی برنامه ی ما وارد می کنه و parent خودش رو پنجره ی اصلی برنامه ی ما قرار میده. ما هندلش رو نداریم و می خواهیم وقتی خودش رو وارد فرم اصلی برنامه ی ما کرد هندلش رو پیدا کنیم. چطوری میشه؟
حقیقتش یک dll هست که با فراخوانی یه procedure از اون dll می تونیم parent ش رو فرم اصلیمون قرار بدیم. ولی هندلش رو نداریم و من با getprocaddress و تازه با درخواست از خودش تونستم اینکارو بکنم. حالا اون اومده و فرزند فرم من شده ، حالا می خوام هندلش رو به دست بیارم تا مخفی بودن یا نمایش دادنش رو به دست بگیرم. در ضمن ، این dll رو با LoadLibrary فراخوانی کردم.

Felony
جمعه 15 آبان 1388, 13:46 عصر
احتمالا براي اين کار يه پيغام به پنجره ي برنامه ي شما توسط ويندوز ارسال ميشه ، که اگر اينطور باشه ميتونيد اون پيغام رو هوک کنيد و اطلاعاتی ازش به دست بیارید .

موفق باشيد .

Felony
جمعه 15 آبان 1388, 13:56 عصر
حقیقتش یک dll هست که با فراخوانی یه procedure از اون dll می تونیم parent ش رو فرم اصلیمون قرار بدیم. ولی هندلش رو نداریم و من با getprocaddress و تازه با درخواست از خودش تونستم اینکارو بکنم. حالا اون اومده و فرزند فرم من شده ، حالا می خوام هندلش رو به دست بیارم تا مخفی بودن یا نمایش دادنش رو به دست بگیرم. در ضمن ، این dll رو با LoadLibrary فراخوانی کردم.
من ویرایش پستتون رو الان دیدم ، پس به قسمت بارگزاری DLL های بیلدر در آریانگار رسیدی ، خوب فهمیدم میخوای چیکار کنی ، فقط اگر میتونی یه نمونه سورس قرار بده که یک DLL رو بارگزاری کردی ، تا ببینیم چی کار میشه کرد .

Delphi-Man
جمعه 15 آبان 1388, 14:41 عصر
من ویرایش پستتون رو الان دیدم ، پس به قسمت بارگزاری DLL های بیلدر در آریانگار رسیدی ، خوب فهمیدم میخوای چیکار کنی ، فقط اگر میتونی یه نمونه سورس قرار بده که یک DLL رو بارگزاری کردی ، تا ببینیم چی کار میشه کرد .
:چشمک: شما خیلی باهوشید!! اینم سورس:

Felony
جمعه 15 آبان 1388, 16:43 عصر
خوب من نمونه رو دیدم ، شما مطمئن هستید که درست کار میکنه ؟ شما تو نمونه به پلاگین دستور رسم رو روی فرم دادید درسته ؟ ولی چیزی رسم نمیشه ، یه نگاهی بندازید .

Mahmood_M
جمعه 15 آبان 1388, 17:53 عصر
راستش من دقیقا متوجه مشکلتون نمی شم ... !
در برنامه ی نمونه ای که قرار دادید آدرس چند تا Procedure از درون DLL گرفته میشه و بعد Procedure ها اجرا میشن ، البته چون من DLL فراخوانی شده رو نداشتم با پیغام Faild مواجه میشم ...
ولی نحوه ی فراخوانی Procedure ها مشکلی نداره ، مشکلتون دقیقا کجاست ؟


خوب من نمونه رو دیدم ، شما مطمئن هستید که درست کار میکنه ؟ شما تو نمونه به پلاگین دستور رسم رو روی فرم دادید درسته ؟ ولی چیزی رسم نمیشه ، یه نگاهی بندازید .
شما اون Plugin.dll رو دارید ، من چون DLL رو اصلا لود نمیشه تا ببینم که رسم میشه یا نه ...

یک سئوال : چرا از cdecl استفاده کردید ؟ مگه قراره در زبان دیگه ای ( C ) هم استفاده بشه ، DLL رو خودتون نوشتید ؟ به سورسش دسترسی دارید ؟

بهتره کمی بیشتر توضیح بدید ...

...

Felony
جمعه 15 آبان 1388, 18:20 عصر
شما اون Plugin.dll رو دارید ، من چون DLL رو اصلا لود نمیشه تا ببینم که رسم میشه یا نه ...
DLL ها پلاگین های نرم افزار مالتی مدیا بیلدر هستند ، یک نمونه براتون ضمیمه کردم .


یک سئوال : چرا از cdecl استفاده کردید ؟ مگه قراره در زبان دیگه ای ( C ) هم استفاده بشه ، DLL رو خودتون نوشتید ؟ به سورسش دسترسی دارید ؟

بهتره کمی بیشتر توضیح بدید ...
از cdecl استفاده شده برای اینکه قراره نرم افزار MMB دستوراتش رو صدا بزنه ، به سورس DLL ها هم دسترسی نداریم ، البته SDK پلاگین ها در دسترس هست .

به طور کلی آقا جاوید دارن یه برنامه مینویسن مثل MMB اما با امکانات بیشتر ، ایشون میخوان کاری کنن تا از پلاگین های بیلدر ( MMB ) بشه در برنامشون استفاده کرد و برنامشون به طور کامل این پلاگین ها رو پشتیبانی کنه .

tdkhakpur
جمعه 15 آبان 1388, 19:00 عصر
كرك شد


var
Form1: TForm1;
h:HMODULE;
f:function:pchar;cdecl;
p:procedure(hwnd:HWND);cdecl;
s:procedure;cdecl;
p2:procedure(pDC: HDC; x, y, nWidth, nHeight: Integer);cdecl;
p3:procedure(sPath: pChar);cdecl;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
h:=LoadLibraryEx('plugin.dll',0,0);
if (h<>0) then begin
@p:=GetProcAddress(h,'SetParentWindow');
@s:=GetProcAddress(h,'Show');
p(handle);
@p2:=GetProcAddress(h,'Draw');
p2(GetDC(handle),0,0,500,500);
@p3:=GetProcAddress(h,'SetPath');
p3(pchar(extractfiledir(paramstr(0))));
s;
end else begin
showmessage('failed');
end;
end;

ولي free مقادير realese dc را بايد خودتان انجام بديد

Delphi-Man
جمعه 15 آبان 1388, 20:32 عصر
خوب من نمونه رو دیدم ، شما مطمئن هستید که درست کار میکنه ؟ شما تو نمونه به پلاگین دستور رسم رو روی فرم دادید درسته ؟ ولی چیزی رسم نمیشه ، یه نگاهی بندازید .
پلاگین درست کار می کنه. دلیل این که رسم نمیشه اینه که خاصیت visible فرمی که داخل dll قرار داره false هست و اکثر پلاگین ها هم همینطورن برا همینه که می خوام هندل فرمه رو به دست بیارم که بتونم خاصیت visible رو روشن کنم

vcldeveloper
جمعه 15 آبان 1388, 23:40 عصر
اگر هندل Parent را دارید، و به عنوان فرم فرزند یا حداقل کلاس آن دسترسی دارید، می تونید با استفاده از EnumChildWindow لیست پنجره های فرزند فرم خودتان را بدست بیارید، و وقتی به پنجره مورد نظرتان رسیدید، هندل آن را استخراج کنید.

Delphi-Man
شنبه 16 آبان 1388, 15:14 عصر
با تشکر از همه ی دوستان. حرف جناب آقای کشاورز رو هنوز امتحان نکردم. کاری رو که آقای خاکپور فرمودند رو انجام دادم عمل میده منتها فقط برای پلاگین هایی که با دلفی ساخته شدن. این پلاگین رو ببینید (با سورس C++ هست):

Felony
شنبه 16 آبان 1388, 15:33 عصر
با تشکر از همه ی دوستان. حرف جناب آقای کشاورز رو هنوز امتحان نکردم. کاری رو که آقای خاکپور فرمودند رو انجام دادم عمل میده منتها فقط برای پلاگین هایی که با دلفی ساخته شدن. این پلاگین رو ببینید (با سورس C++‎‎‎‎ هست):
در مرود راه حل آقای کشاورز یه مشکلی هست اینکه شما نه عنوان فرم پلاگین رو داری نه کلاسش رو ، مگر اینکه اینطور فکر کنیم که هیچ شئ خاصی جز پلاگین قرار نیست به فرم شما اضافه بشه که در این صورت میشه تمام هندل هایی که Parent شون فرم اصلی هست رو نمایش داد که موقع اجرای نرم افزار همه ی پلاگین ها نمایش داده میشن .

در اون موردی که پلاگین ++C هم شما SDK بیلدر برای ++C رو ببینید شاید کمکتون کنه .

در ضمن شما چه جوری پلاگین ها رو تو آریا نگار بارگزاری میکنید ؟ ( در زمان طراحی ) ، منظورم این هست که چه رابطی برای دادن مختصات پلاگین و اندازش دارید ؟ تو بیلدر شی Plugin این کار رو میکنه و اندازش میشه فرم پلاگین و مختصات اون ؟ اگر شما هم اینطور عمل کرده باشی میتونی موقع اجرا تمام هندل هایی که parent شون فرم برنامه هست و از نوع Plugin هستند رو نمایش بدید و برای مخفی کردنشون هم وقتی نمایش داده شدن میتونید نام کلاس و ... رو بدست بیارید و متناسب با نیازتون ...

موفق باشید .

Delphi-Man
شنبه 16 آبان 1388, 20:49 عصر
در مرود راه حل آقای کشاورز یه مشکلی هست اینکه شما نه عنوان فرم پلاگین رو داری نه کلاسش رو ، مگر اینکه اینطور فکر کنیم که هیچ شئ خاصی جز پلاگین قرار نیست به فرم شما اضافه بشه که در این صورت میشه تمام هندل هایی که Parent شون فرم اصلی هست رو نمایش داد که موقع اجرای نرم افزار همه ی پلاگین ها نمایش داده میشن .

در اون موردی که پلاگین ++C هم شما SDK بیلدر برای ++C رو ببینید شاید کمکتون کنه .

در ضمن شما چه جوری پلاگین ها رو تو آریا نگار بارگزاری میکنید ؟ ( در زمان طراحی ) ، منظورم این هست که چه رابطی برای دادن مختصات پلاگین و اندازش دارید ؟ تو بیلدر شی Plugin این کار رو میکنه و اندازش میشه فرم پلاگین و مختصات اون ؟ اگر شما هم اینطور عمل کرده باشی میتونی موقع اجرا تمام هندل هایی که parent شون فرم برنامه هست و از نوع Plugin هستند رو نمایش بدید و برای مخفی کردنشون هم وقتی نمایش داده شدن میتونید نام کلاس و ... رو بدست بیارید و متناسب با نیازتون ...

موفق باشید .
سلام منظورتون از رابط چیه؟ خب اول از همه با فراخوانی procedure SetParent به پلاگین هندل فرمی رو که در فایل اجرایی هست میدیم. بعد با اجرای پروسیجر Draw مختصات رو به پلاگین میدیم (هر دو از جمله دستورات پلاگین هستند که ما فراخوانی می کنیم)... در زمان طراحی هم که آریا نگار مثل شیء فلش که دیدید می نویسه "نمایان در هنگام اجرا" پس به جز اطلاعات copyright از پلاگین چیزی دریافت نمیکنه (مثل mmb) اگه از روشی که جناب کشاورز گفتن بشه هندلها رو گرفت میشه هنگامی که فایل اجرایی پروژه ای که با AN ساخته شده اجرا میشه و داره اشیاء ساخته میشه ، پس از ساخت هر پلاگین جدید هندلی رو که جدید به فرزندان فرم اضافه شده رو گرفت و اون میشه هندل پلاگین... حالا باید همینارو امتحان کنم ببینم چی میشه...

Felony
شنبه 16 آبان 1388, 21:05 عصر
سلام منظورتون از رابط چیه؟ خب اول از همه با فراخوانی procedure SetParent به پلاگین هندل فرمی رو که در فایل اجرایی هست میدیم. بعد با اجرای پروسیجر Draw مختصات رو به پلاگین میدیم (هر دو از جمله دستورات پلاگین هستند که ما فراخوانی می کنیم)... در زمان طراحی هم که آریا نگار مثل شیء فلش که دیدید می نویسه "نمایان در هنگام اجرا" پس به جز اطلاعات copyright از پلاگین چیزی دریافت نمیکنه (مثل mmb) اگه از روشی که جناب کشاورز گفتن بشه هندلها رو گرفت میشه هنگامی که فایل اجرایی پروژه ای که با AN ساخته شده اجرا میشه و داره اشیاء ساخته میشه ، پس از ساخت هر پلاگین جدید هندلی رو که جدید به فرزندان فرم اضافه شده رو گرفت و اون میشه هندل پلاگین... حالا باید همینارو امتحان کنم ببینم چی میشه...

منظورم رو متوجه نشدید ، ببینید شما تو بیلدر جه طور یک پلاگین رو باز میکنید ؟ یک شئ پلاگین روی فرم میزارید و بعد دابل کلیک و لود پلاگین ، بعد از این کار اون شئ پلاگین میشه مختصات و اندازه ی پلاگینتون ، حالا شما میتونید مثلا یک کلاس از TFrame یا TPanel یا همچین چیزایی برای شئ پلاگین تو آریا نگار مشتق کنید ، که با گزاشتن اون روی فرم برنامه در حالت Design بشه مثل شئ پلاگین در بیلدر باهاش رفتار کرد ، حالا موقع اجرای نرم افزار تمام هندل های شئ هایی که ار نوع کلاس مشتق شده ی جدید هستند رو میگیرید و اون هندل ها میشه هندل شئ ها پلاگینتون ، البته گفتم باید یک چیز مثل شئ پلاگین در بیلدر ایجاد کنید .
البته این ها نظر و تئوری هست و باید یه قول خودتون تست بشن .

موفق باشید .