با سلام خدمت دوستان.
مي خواستم بدونم كه فايل هاي Dll در دلفي به چه كار مي آيد واگر مي شه توضيح مناسبي در ايم مورد بگين. ممنون.
Printable View
با سلام خدمت دوستان.
مي خواستم بدونم كه فايل هاي Dll در دلفي به چه كار مي آيد واگر مي شه توضيح مناسبي در ايم مورد بگين. ممنون.
فایل های DLL یا Dinamic Link Library شامل یکسری توابع و کدهای زبان ماشین (کامپایل شده) هستند.
فرض کن تابعی رو برای محاسبه تاریخ شمسی از قمری نوشتی و نمیخوای کسی الگوریتم کارت رو بفهمه (!!!) اون تابع رو در یک DLL ذخیره میکنی و نحوه استفاده از اون (نام تابع،پارامترها و....) رو معرفی میکنی و اونو به دوستت می فروشی تا بدون اینکه از الگوریتم کارت سر در بیاره بتونه از اون تابع استفاده کنه !
البته این یه مثال بود !
بعضی توابع و فایل مهم که در برنامه لازمه هم روی سیستم به صورت DLL هستند.
مثلا برنامه هایی که با دلفی مینویسی از توابع خاصی از سیستم عامل ویندوز استفاده میکنن که در DLL هایی مثال Kernel32.dll و user32.dll و.... قرار دارن.
توضیحش مفصله !
با سلام خدمت دوستان.
ادميرال جان اولا لطف كردين كه من رو راهنمايي كردين. حالا اگه امكانش هست بگين كه چطوري مي شه يك فايل دي ال ال ساخت و از آن استفاده كرد؟
يك چيزه ديگه كه من تاپيك هاي ديگه هم زدم. چرا به آنها جواب نمي دهيد؟
ممنون.
سلام دوست عزیزنقل قول:
با سلام خدمت دوستان.
ادميرال جان اولا لطف كردين كه من رو راهنمايي كردين. حالا اگه امكانش هست بگين كه چطوري مي شه يك فايل دي ال ال ساخت و از آن استفاده كرد؟
دلفی رو باز کنید و از منوی File -> New->Other گزینه Dll wizard رو انتخاب کنید.
حالا قبل از Begin فانکشن ها و پروسیجرهای مورد نظر خودتون رو بنویسید.
حالا بعد از تعریف توابع و قبل از begin بنویسید Exports و بعدش نام توابع رو با کاما از هم جدا کنید و آخرش هم سمی کالن بزارید.مثلاً:
حالا پروژه رو Save کنید و یک فایل DLL هم توی پوشه محل ذخیره بوجود میاد !کد:exports
test1,test2;
این روش ساخت DLL بود. اگه روش فراخوانیش رو هم خواستی بگو تا بنویسم.
دو تا احتمال داره :نقل قول:
يك چيزه ديگه كه من تاپيك هاي ديگه هم زدم. چرا به آنها جواب نمي دهيد؟
ممنون.
یا عنوان تاپیک توجه من رو جلب نکرده!
یا بلد نبودم ! (این یکی احتمالش بیشتره!)
با سلام خدمت دوستان.
ادميرال جان لطف كنيد و اين موضوع را تا جايي كه به درد بخوره ادامه بدهيد ممنون مي شم.
ممنون.
سلام
روش ایجا فایل DLL رو که گفتم حالا می مونه روش فراخوانی یک تابع یا پروسـجـر از داخل فایل DLL :
باید در قسمت تعریف توابع برنامه (بعد از implementation) امضای کامل تابع رو بنویسید.
که امضای تابع شامل نام + پارامترها + نوع بازگشتی میشه.
بعد نوع فراخوانی رو مشخص میکنید که میتونه StdCall یا Register و ... باشه.
بعد هم با عبارت External مشخص می کنید روال باید از کدوم DLL لــود بشه.
نتیجه یه چیزی شبیه این میشه :
توی دلفی اگه نوع فراخوانی رو مشخص نکنی به طور پیش فرض Register در نظر گرفته میشه.کد:function mul(x:integer):integer;register; external 'MyDll.Dll'
procedure hello;stdcall;external 'MyDll.Dll'
موفق باشید.
با سلام خدمت دوستان.
ادميرال جان اين كارهايي كه گفتي كردم ولي دفعه اول جواب داد و يك فايل Dll درست كرد ولي دفعات بعد چهار فايل ذخيره مي كرد كه هيچ كدام Dll نبود. چند بار هم امتحان كردم .اگه مي شه بگو مشكل كجاست؟ مطلب ديگه اين كه در مورد نوع فراخواني هم بيشتر توضيح بده؟
بعد از اینکه Save رو زدی یکبار هم Run رو بزن.(کلید F9)نقل قول:
ادميرال جان اين كارهايي كه گفتي كردم ولي دفعه اول جواب داد و يك فايل Dll درست كرد ولي دفعات بعد چهار فايل ذخيره مي كرد كه هيچ كدام Dll نبود. چند بار هم امتحان كردم .اگه مي شه بگو مشكل كجاست؟
اصلاً نوع فراخوانی رو ننویس خودش پیش فرض Register هست و لازم نیست کار خاصی انجام بدی.نقل قول:
مطلب ديگه اين كه در مورد نوع فراخواني هم بيشتر توضيح بده؟
با سلام خدمت دوستان.
ادميرال جان دستت درد نكنه از اين كه راهنماييم كردي.
ولي وقتي كه مي خواهم كه برنامه را اجرا كنم يك پيغام خطا مي ده به اين مفهوم.
Can not Debug project unless a host application is defined. use the run|parameters... debug box.
كلا براي اطلاعات عمومي گفتم كه نوع فراخواني چي هست و چي كار مي كنه؟نقل قول:
اصلاً نوع فراخوانی رو ننویس خودش پیش فرض Register هست و لازم نیست کار خاصی انجام بدی.
ممنون.
طبیعیه، چون این فایل اجرایی نیست که اجرا بشه.فقط واسه این گفتم که فایل DLL رو بسازه. فایل DLL رو ساختش ؟نقل قول:
ادميرال جان دستت درد نكنه از اين كه راهنماييم كردي.
ولي وقتي كه مي خواهم كه برنامه را اجرا كنم يك پيغام خطا مي ده به اين مفهوم.
Can not Debug project unless a host application is defined. use the run|parameters... debug box
باید با اسمبلی آشنایی داشته باشی تا اساسی مفهومش رو متوجه بشی.نقل قول:
كلا براي اطلاعات عمومي گفتم كه نوع فراخواني چي هست و چي كار مي كنه؟
اینا رو بخون( از Help دلفی) :
کد:Calling conventions
Directive Parameter order Clean-up Passes parameters in registers?
register Left-to-right Routine Yes
pascal Left-to-right Routine No
cdecl Right-to-left Caller No
stdcall Right-to-left Routine No
safecall Right-to-left Routine No
The default register convention is the most efficient, since it usually avoids creation of a stack frame. (Access methods for published properties must use register.) The cdecl convention is useful when you call functions from shared libraries written in C or C++, while stdcall and safecall are recommended, in general, for calls to external code. On Windows, the operating system APIs are stdcall and safecall. Other operating systems generally use cdecl. (Note that stdcall is more efficient than cdecl.)
The safecall convention must be used for declaring dual-interface methods. The pascal convention is maintained for backward compatibility. For more information on calling conventions, see Program control.
The directives near, far, and export refer to calling conventions in 16-bit Windows programming. They have no effect in 32-bit applications and are maintained for backward compatibility only.
با سلام خدمت دوستان.
ادميرال جان دستت درد نكنه جواب داد. فعلا تا قدم بعدي ممنون و خدا نگهدار.
ممنون.
مـوفـق بـــــاشی
با سلام خدمت دوستان.
ادميرال جان يك مشكل جديد. من يك DLL درست كردم و قصد استفاده از آن را داشتم براي همين كار پشت يك كليد تابع را با نام اصلي خودش فراخواني كردم نه با نامي كه ذخيره كردم. و خروجي آنرا در صفحه نمايش قرار دادم. ولي وقتي برنامه را اجرا مي كنم اين خطا ظاهر مي شود.
من بايد چي كار كنم؟نقل قول:
the application failed to intialize properly (0x000007b). click on ok to terminate the application.
ممنون
سلامنقل قول:
ادميرال جان يك مشكل جديد. من يك Dll درست كردم و قصد استفاده از آن را داشتم براي همين كار پشت يك كليد تابع را با نام اصلي خودش فراخواني كردم نه با نامي كه ذخيره كردم. و خروجي آنرا در صفحه نمايش قرار دادم. ولي وقتي برنامه را اجرا مي كنم اين خطا ظاهر مي شود.
من منظورت از نام اصلی و نام ذخیره شده رو نمی فهمم!!!
بیشتر توضیح بده.
اگه برات مقدوره کد Dll و برنامه ات رو بزار.
با سلام خدمت دوستان.
ببين ادميرال جان وقتي مي خواهي تابع را به صورت DLL در بياوريم يك اسم بايد بديم ديگه. البته بگم كه وقتي مي نويسم Exports test; از كلمه test اشكال مي گيره و براي همين وقتي Ctrl+s مي زنم در همان كه ذخيره مي شود يك اسم بهش مي دم.
خوب تا اينجا. مگر تابعي كه نوشتيم يك اسم نداره كه بايد شناسنامه آنرا كامل بنويسم. خوب من هم همان اسم را در پشت كليد مي نويسم ديگه.OK
اين هم لينك دانلود يكي از تابع هايم.نقل قول:
اگه برات مقدوره کد Dll و برنامه ات رو بزار.
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
سلامنقل قول:
ببين ادميرال جان وقتي مي خواهي تابع را به صورت DLL در بياوريم يك اسم بايد بديم ديگه. البته بگم كه وقتي مي نويسم Exports test; از كلمه test اشكال مي گيره و براي همين وقتي Ctrl+s مي زنم در همان كه ذخيره مي شود يك اسم بهش مي دم.
خوب تا اينجا. مگر تابعي كه نوشتيم يك اسم نداره كه بايد شناسنامه آنرا كامل بنويسم. خوب من هم همان اسم را در پشت كليد مي نويسم ديگه.OK
این یه DLL ساده ست که برای مثال نوشتم :
این هم تعریف امضای توابع در پروژه ای که میخواد از DLL استفاده کنه.کد:library MyDLL;
uses
SysUtils,
Classes,
Dialogs;
{$R *.res}
procedure func1;
begin
ShowMessage('Function 1');
end;
procedure func2;
begin
ShowMessage('Function 2');
end;
function add(i1,i2:integer):integer;
begin
result:=i1+i2;
end;
exports
func1,func2,add;
begin
end.
البته فایل DLL باید در پوشه ای که پروژه رو Save کردی قرار بدی.کد:procedure func1;external 'MyDLL.dll'
procedure func2;external 'MyDLL.dll'
function add(s1,s2:integer):integer;external 'MyDll.dll'
موفق باشی
با سلام خدمت دوستان.
ادميرال جان با عرض معذرت يک مشکل کوچله ديگه. برنامه قبلي که بهت گفت رو نوشتم يعني همان که پشت يک کليد تابع را فراخواني مي کردم و نتيجه را در يک Edit قرار مي دهم. برنامه اجرا مي شه و مثل قبل خطا نمي ده. مشکل اينجا است که وقتي روي دکمه کليک مي کنم اول خطاي زير را مي ده و بعد از نتيجه در Edit قرار مي گيره.
Invalid pointer operation
اگر امکامش هست من رو راهنمايي کنيد که خيلي هم لازمش دارم و ديگه داره دير ميشه.
کد برنامه هم این است .
procedure TForm1.Button1Click(Sender: TObject);
var str:string[10];
begin
str:=changedate;
Edit1.Text:=str;
end;
ممنون
با سلام خدمت دوستان.
ادميرال جان مثل اين كه از كمك كردن به من خسته شدي. آخراشه ديگه يكم ديگه ما رو تحمل كن ديگه رفتني هستيم.
ممنون.