در اين بخش مي‌توانيد به مباحث مربوط به انواع زبان هاي برنامه نويسي بپردازيد
Major

Major



نماد کاربر
پست ها

57

تشکر کرده: 0 مرتبه
تشکر شده: 0 مرتبه
تاريخ عضويت

شنبه 20 اسفند 1384 12:23

آرشيو سپاس: 12 مرتبه در 7 پست

استفاده از DLL‌ها در دلفی

توسط ORZ » پنج شنبه 25 آبان 1385 05:32

استفاده از DLL‌ها در دلفی  
ایجاد یک DLL
با استفاده از منو فایل گزینه New Items را انتخاب کنید و آیتم DLL Wizard را انتخاب نمایید. حال به فایل ایجاد شده، یک فرم با استفاده از روش بالا اضافه نمایید. دقت نمایید که Application را بجای فرم انتخاب ننمایید. حال اگر فرض کنیم که نام فرم شما Demo باشد و بانام UDemo.pas آنرا ذخیره کرده باشید. باید در فایل DLL بصورت زیر کد نویسی نمایید:

library demodll;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
   SysUtils,
   Classes,
   UDemo in 'UDemo.pas' {Demo};

{$R *.res}
procedure ShowdemoForm;stdcall;
begin
   Demo :=Tdemo.Create(nil);
   demo.Show;
end;

function ShowdemoFormModal:integer;stdcall;
begin
   demo :=Tdemo.Create(nil);
   Result := demo.ShowModal;
end;

Exports
   ShowDemoForm,
   ShowdemoFormModal;
begin
end.

دقت کنید که نام DLL فوق DemoDll می باشد و با نام DemoDll.dpr ذخیره گردیده است.

حال بر روی فرم موجود تمام دکمه‌ها و آبجکت‌های مورد نظرتان را اضافه و کد نویسی کنید (اختیاری). در پایان در منو Project گذینه Build DemoDll را انتخاب کرده و اجرا نمایید. فایلی با نام DemoDll.dll ایجاد می گردد که برای استفاده آماده است.


استفاده از یک DLL بصورت دینامیکی
برای استفاده از یک DLL ‌بصورت دینامیکی، ابتدا نام توابعی را که در فایل DLL شما موجود است بصورت زیر تعریف نمایید:

unit UMain;

interface

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls, ExtCtrls;

type
TShowdemoFormModal= Function :integer;
.
.
.

دقت کنید که نام برنامه انتخابی پیش فرض Main و با نام UMain.pas ذخیره گشته است. حال برای لود کردن DLL یادشده، یک دکمه بر روی فرم قرارداده آنرا بصورت زیر کد نویسی کنید:

var
hndDLLHandle:THandle;
ShowdemoFormModal:TShowdemoFormModal;

procedure TFMain.Button1Click(Sender: TObject);
begin
   try
      hndDLLHandle:=LoadLibrary('Demodll.dll');

      if hndDLLHandle <> 0 then begin
         @ShowdemoFormModal:=getProcAddress(hndDLLHandle,'ShowdemoFormModal');

         if addr(ShowdemoFormModal) <> nil then begin
            ShowdemoFormModal;
         end
         else
            showmessage ('function not exists ...');
         end
      else
         showMessage('Dll Not Found!');
      finally
         freelibrary(hndDLLHandle);
      end;
end;

فرم شما آماده اجراست. در پایان متذکر می شوم که استفاده ار روش دینامیکی در لود کردن DLL ها باعث پایین آمدن سرعت نمایش فرم‌ها و در عوض بالارفتن سرعت برنامه خواهد شد.





منبع
http://www.idevcenter.com
کسي را دوست داشته باش که قلب بزرگي داشته باشد
تا مجبور نباشي براي اينکه در قلب او جاي بگيري خودت را کوچک کني.

Colonel I

Colonel I



no avatar
پست ها

643

تشکر کرده: 0 مرتبه
تشکر شده: 7 مرتبه
تاريخ عضويت

سه شنبه 19 تیر 1386 13:08

آرشيو سپاس: 1235 مرتبه در 259 پست

توسط Frogfoot » سه شنبه 19 تیر 1386 13:18

لود کردن دینامیک Dll موجب افزایش سرعت برنامه نمیشه، بلکه باعث میشه اون برنامه منابع سیستم را کمتر هدر بده.
برای لود یک فرم از طریق DLL حتما Handle شی Application از برنامه فراخوان DLL را به فرم داخل DLL پاس بدید، تا برخی مسائل غیر منتظره (مثل نمایش یک دکمه جدید برای فرم ایجاد شده در Taskbar) جلوگیری کنید.
برای این کار باید تابع نمایش دهنده فرم شما یک پارامتر از نوع THandle (یا Cardinal) دریافت کنه و مقدار Application.Handle مربوط به DLL را برابر با این پارامتر قرار بده:
کد: انتخاب همه
 لينکها براي کاربران مهمان قابل دسترسي نيست، براي مشاهده ي لينکها لطفا ثبت نام کرده و وارد شويد 

در ضمن، هیچوقت یک فرم Modal را خارج از چارچوب try-finally بکار نبرید، چون در صورت بروز هر گونه مشکل در فرم، شی فرم ساخته شده هیچ وقت آزاد نمیشه و موجب نشت حافظه میشه.


 


  • موضوعات مشابه
    پاسخ ها
    بازديدها
    آخرين پست

چه کسي حاضر است ؟

کاربران حاضر در اين انجمن: بدون كاربران آنلاين و 1 مهمان