View Full Version : استفاده از Indy در dll
mr_program
جمعه 04 دی 1388, 12:24 عصر
سلام.
من دارم یه DLL مینویسم که یه بخشی از اونو اگر میتونستم یا استفاده از کامپوننت های Indy بنویسم خیلی کارم راحت میشد.
آیا راهی هست که تو نوشتن DLL از کامپوننت های Indy مثل idhttp استفاده کرد؟
vcldeveloper
شنبه 05 دی 1388, 01:33 صبح
آیا راهی هست که تو نوشتن DLL از کامپوننت های Indy مثل idhttp استفاده کرد؟
محدودیتی در استفاده از Indy در DLL وجود نداره.
mr_program
شنبه 05 دی 1388, 12:18 عصر
سلام
بابت جوابتون ازتون متشکرم.
فقط میشه یه مثال هم بزنید؟
آخه تو نوشتن DLL فرم که نداریم تا بتونیم کامپوننت هامون رو روشون بزاریم.
mr_program
یک شنبه 06 دی 1388, 12:48 عصر
سوالم واضح نپرسیدم؟
منظورم اینه که چه جوری از Indy میتونم تو نوشتن یک DLL استفاده کنم؟
Felony
یک شنبه 06 دی 1388, 18:10 عصر
باید کامپوننت مورد نظر رو به صورت RunTime ایجاد کنید و مدیریت حافظه ی اشغال شده توسط اون هم با خودتون هست .
mr_program
یک شنبه 06 دی 1388, 18:28 عصر
میشه در مورد run time توضیح بدید که دقیقا چیه؟ و چه ربطی به DLL داره؟ و چه جوری باید این کارو کرد؟ منبع خوبی هم سراغ دارید معرفی کنید ممنون میشم.
Felony
یک شنبه 06 دی 1388, 19:17 عصر
منظور از RunTime در حال اجرا هست ، به طور مثال با قطعه کد زیر یک کامپوننت TCP Client به صورت RunTime ایجاد میشه :
Procedure CreateRunTime;
var
Test: TIdTCPClient;
begin
Testt:= TIdTCPClient.Create(nil);
end;
البته یادتون باشه که باید کتابخانه های مورد نیاز TCP Client رو به Uses اضافه کنید .
mr_program
دوشنبه 07 دی 1388, 11:22 صبح
مرسی بابت پاسختون.
فقط یه چیزی میمونه؟
TIdTCPClient.Create(nil);
nil یعنی چی؟ واسه چی از nil استفاده کردید؟
یه سوال دیگه؟
وقتی با DLL Wizard یک پروژه DLL جدید درست میکنیم میتونیم به منو File>New>Form بریم و یه فرم به پروژه اضافه کنیم حالا میخوام بدونم اینجوری میشه کامپوننت مورد نظر رو روی فرم گذاشت و توی DLL از کامپوننت استفاده کرد؟
اگر میشه یه مثال هم واسم بزنید؟
Felony
دوشنبه 07 دی 1388, 12:31 عصر
nil یعنی چی؟ واسه چی از nil استفاده کردید؟
nil یعنی هیچی ، nil یک اشاره گر هست که ما به وسیله ی اون به کامپایلر میفهمونیم که شئ ساخته شده Owner نداره .
یه سوال دیگه؟
وقتی با DLL Wizard یک پروژه DLL جدید درست میکنیم میتونیم به منو File>New>Form بریم و یه فرم به پروژه اضافه کنیم حالا میخوام بدونم اینجوری میشه کامپوننت مورد نظر رو روی فرم گذاشت و توی DLL از کامپوننت استفاده کرد؟
بله میشه ، ولی از مزایا و معایبش اطلاعی ندارم .
vcldeveloper
دوشنبه 07 دی 1388, 15:52 عصر
وقتی با DLL Wizard یک پروژه DLL جدید درست میکنیم میتونیم به منو File>New>Form بریم و یه فرم به پروژه اضافه کنیم حالا میخوام بدونم اینجوری میشه کامپوننت مورد نظر رو روی فرم گذاشت و توی DLL از کامپوننت استفاده کرد؟
اون وقت باید به جای Create کردن کامپوننت مورد نظرتان، فرم مورد نظر را Create کنید. اگر به خودِ فرم نیازی ندارید، و نیازتان هم فقط به یک یا دو کامپوننت محدود هست، این کار سربار داره، چون بخش عمده ایی از قابلیت ها فرم اصلا استفاده نمیشند.
اگر نیاز دارید که یک سری کامپوننت غیر ویژوال (مثل همین کامپوننت های Indy یا کامپوننت های اتصال به بانک اطلاعاتی) را یک جا داشته باشید، و خودتان هر بار آنها را ایجاد و حذف نکنید، و تک تک خصوصیات آنها را تنظیم نکنید، بهتر هست بجای فرم از Data Module استفاده کنید که یک فرم غیر ویژوال برای همچین اموری در اختیار شما قرار میده، و سربار کمتری نسبت به یک فرم معمولی داره.
بهتر هست هدف خودتان از ساخت DLL و استفاده از Indy در آن را توضیح بدید تا بشه توضیح یا مثال بهتری ارائه کرد.
mr_program
دوشنبه 07 دی 1388, 23:07 عصر
با تشکر از دوستان.
nil یعنی هیچی ، nil یک اشاره گر هست که ما به وسیله ی اون به کامپایلر میفهمونیم که شئ ساخته شده Owner نداره .
ببخشید ولی Owner چی هست؟
بهتر هست هدف خودتان از ساخت DLL و استفاده از Indy در آن را توضیح بدید تا بشه توضیح یا مثال بهتری ارائه کرد.
راستش میخوام با Idhttp دستورات Http رو بفرستم و کار با این کامپوننت از Winsock خیلی راحت تره پس دوست دارم از این استفاده کنم نه winsock.
بجای فرم از Data Module استفاده کنید که یک فرم غیر ویژوال برای همچین اموری در اختیار شما قرار میده، و سربار کمتری نسبت به یک فرم معمولی داره.
این راهکار خیلی خوبی هست و استفاده کردم خیلی راحت میشه از کامپوننت ها استفاده کرد.
اینجوری دیگه:
unit1.DataModule1.IdHTTP1.Host:='google.com';
unit1 هم اسم همون Data Module هست که به DLL Wizard اضافه کردم.
درسته؟
فقط یه چیز دیگه که میمونه اینه که مثلا رویداد On Connected از کامپوننت Idhttp رو از کجا میشه تو DLL تشخیص داد؟
vcldeveloper
سه شنبه 08 دی 1388, 17:56 عصر
فقط یه چیز دیگه که میمونه اینه که مثلا رویداد On Connected از کامپوننت Idhttp رو از کجا میشه تو DLL تشخیص داد؟
روی شی IdHttp مربوطه کلیک کنید، سپس در Object Inspector در تب Events روی OnConnect دابل کلیک کنید، و کد مورد نظرتان را بنویسید. از این نظر فرقی نمیکنه که در DLL از اون کامپوننت استفاده کرده باشید، در انواع دیگه پروژه ها.
البته یادتون باشه که Data Module شما در DLL بطور خودکار ساخته نمیشه، و خودتون باید هر زمان که بهش نیاز دارید، آن را Create کنید، و وقتی کارتان باهاش تمام شد، آن را Free کنید.
mr_program
چهارشنبه 09 دی 1388, 21:39 عصر
آقای کشاورز واقعا ازتون ممنونم آخه اینو تو هیچ کتابی ندیده بودم و واقعا واسم جالب بود.
فقط اگر میشه بگید مثلا اگر تو یکی از Function ها نیاز به یکی از کامپوننت های روی Data Module داشتیم توی Function چه جوری Data Module رو create کنم؟ و اگر بعد از اتمام کار اونو Free نکنم چی میشه؟
اگر بعد از اتمام کار اونو Free نکنم نمیشه توی یه Function دیگه اونو Create کنم؟
vcldeveloper
پنج شنبه 10 دی 1388, 00:48 صبح
اگر بعد از اتمام کار اونو Free نکنم چی میشه؟
اگر بعد از اتمام کار اونو Free نکنم نمیشه توی یه Function دیگه اونو Create کنم؟ اگر Free نکنید، می تونید دوباره Create کنید، ولی با این کارتان باعث نشت حافظه میشید؛ یعنی فضاهایی از حافظه اشغال میشند، ولی هیچ وقت در طول اجرای برنامه آزاد نمیشند. این مسئله بخصوص برای DLLها خطرناکه!
برای ساخت DataModule و آزاد سازی آن می تونید از قالب کلی زیر استفاده کنید.
procedure MyProcedure;
var
DataModule : TMyDataModule;
begin
DataModule := TMyDataModule.Create(nil);
try
{Write your code here}
finally
DataModule.Free;
end;
end;
در کد بالا، به جای TMyDataModule نام کلاس Data Module جدیدی که درست کردید را قرار بدید، مثلا TDataModule1. به جای MyProcedure هم اسم تابع یا Procedure خودتان را قرار بدید. کد مورد نظرتان را هم به جای اون کامنت داخل بلوک try-finally بنویسید.
DAMAVAND
پنج شنبه 10 دی 1388, 04:00 صبح
با تشکر از جناب کشاورز
حالا اگه ما بخواهيم يک Event رو تو DLL استفاده کنيم چي ?
چطوري وقتي Event کامپوننت مورد نظرمون تو Datamodal اتفاق افتاد توي برنامه اي که داره از DLL استفاده ميکنه متوجه بشيم که اين Event فراخواني شده ?
Felony
پنج شنبه 10 دی 1388, 07:38 صبح
با تشکر از جناب کشاورز
حالا اگه ما بخواهيم يک Event رو تو DLL استفاده کنيم چي ?
چطوري وقتي Event کامپوننت مورد نظرمون تو Datamodal اتفاق افتاد توي برنامه اي که داره از DLL استفاده ميکنه متوجه بشيم که اين Event فراخواني شده ?
منظورتون این هست که چه طور اجرای یک رویداد رو تو DLL متوجه بشیم ؟
اگر منظورتون این هست که تا به حال چندین بار بحث شده ، " اختصاص رویداد در زمان اجرا " رو جست و جو کنید .
vcldeveloper
پنج شنبه 10 دی 1388, 15:18 عصر
چطوري وقتي Event کامپوننت مورد نظرمون تو Datamodal اتفاق افتاد توي برنامه اي که داره از DLL استفاده ميکنه متوجه بشيم که اين Event فراخواني شده ?
باید دید برنامه شما داره چه استفاده ایی از اون DLL میکنه. اگر فرضا برنامه شما نیاز داشته باشه که در زمان اجرای کدهای DLL در مواقعی کدهای خاصی را اجرا کنه، می تونید از توابع Callback استفاده کنید، یعنی آدرس یک تابع از برنامه خودتان را به DLL ارسال کنید، تا هر زمان که آن رویداد خاص اتفاق افتاد، DLL تابع شما را فراخوانی کنه. در این حالت کدی که شما برای آن تابع نوشتید، اجرا خواهد شد. این همون کاری هست که در زمان Hook کردن انجام میدید، یا کاری که با استفاده از تابع EnumChildWindows در سیستم عامل ویندوز انجام میدید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.