ايران ويج

نسخه‌ی کامل: تعریف کلاس در dll و استفاده از آن در exe (حیاتی)(حیاتی) لطفا کمک کنید
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
چطور میشه یک کلاس رو در یک فایل dll توسط دلفی نوشت
و بعد از آن در یک برنامه به زبان دلفی استفاده کرد.
مثل استفاده از یکسری dll ها که در قسمت type library
دلفی ازشون استفاده میشه.

این پروژه برام خیلی مهمه چون میخام از کلاسم که در دلفی
می نویسم در دلفی ، سی و یا زبانهای دیگه استفاده


دوستان خواهش میکنم کمک کنید. ممنون
یعنی هیچ کس نمی دونه چطوری میشه یک کلاسو در دی ال ال تعریف کرد؟

یعنی یک کلاس در دی ال ال تعریف بشه و بعد در برتانه ازش استفاده بشه

من توی سی شارپ می تونم ولی با دلفی نمی تونم

لطفا کمک کنید.
محمد جان من ساخت توابع و استفاده از اونها رو در دلفی
می دونم و حتی چندین دی ال ال تو دلفی نوشتم من میخام
یک کلاس رو در دی ال ال پیاده سازی کنم، لطفا توضیحات رو
قشنگ بخونید.

در هر صورت از کمک شما متشکرم.
درسته رفیق ! من درست نخوندم ! Shy
متاسفانه واسه این مشکل چیزی نتونستم پیدا کنمSad
برای این کار می تونید یک Interface تعریف کنید که بین پروژه ایی که از DLL استفاده میکنه و خود DLL مشترکا استفاده بشه:

کد:
unit uTestInt;

interface

type
ITest = interface
function Add(a,b: real): real;
procedure TestProc;
end;

implementation

end.* این یونیت یک اینترفیس ساده با دو متد تعریف میکنه. این یونیت باید در هر دو پروژه use بشه.

حالا باید یک کلاس در DLL تعریف کنید که متدهای Interface بالا را پیاده سازی کنه. یک تابع هم باید بنویسید که یک نمونه از این کلاس ایجاد کنه و نتیجه را بصورت Interface بالا (در این مثال ITest) برگردونه:

کد:
library dllTest;

uses
SysUtils,
uTestInt in 'uTestInt.pas';

{$R *.res}
type
TTest = class(TInterfacedObject,ITest)
public
function Add(a,b: real): real;
procedure TestProc;
end;

{ TTest }

function TTest.Add(a, b: real): real;
begin
Result := a + b;
end;

procedure TTest.TestProc;
begin
//nothing;
end;

//////////////////////////////////////
function CreateTest: ITest; stdcall;
begin
Result := TTest.Create;
end;

exports
CreateTest;

begin
end.* دقت کنید که تابع CreateTest نتیجه را بصورت ITest برمی گردان (اینترفیس)د، نه TTest.

در مرحله آخر هم باید در پروژه ایی که از DLL استفاده می کند، یونیتی که تعریف اینترفیس در آن است را به لیست uses اضافه و تابع CreateTest را تعریف کنید:


کد:
function CreateTest: ITest; stdcall; external 'dllTest.dll' name 'CreateTest';حالا با ایجاد یک متغیر از نوع ITest و نسبت دادن خروجی تابع CreateTest به آن، می توانید یک نمونه از اینترفیس ITest که توسط کلاس TTest در dllTest.dll پیاده سازی شده است، داشته باشید. کد کامل پروژه:

کد:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
Test : ITest;
end;

function CreateTest: ITest; stdcall; external 'dllTest.dll' name 'CreateTest';
var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Test := CreateTest;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
R : real;
begin
if Assigned(Test) then
begin
R := Test.Add(2,2);
ShowMessage(FloatToStr®)
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Test := nil;
end;

end.* دقت کنید که نمونه ایی از ITest که ساختیم و به متغیر Test اختصاص دادیم، هیچوقت Free نشد، بلکه فقط مقدار Test را برابر با nil کردیم. علتش هم استفاده از Interface است. نوع Interface در دلفی Reference-counted هست و بطور خودکار آزاد می شود.
بجای Interface می تونستید از نوع های دیگه هم استفاده کنید:
1- Pointer: در صورت استفاده از Pointer کد ساده تر می شد، اما باید مقدار برگشت داده شده از تابع CreateTest را به کلاس مورد نظر خود Type Cast می کردید. و امکان استفاده از Code Completion هم در زمان کدنویسی نداشتید. Object ایجاد شده هم باید توسط یک تابع دیگر Free می شد.
2- استفاده از Abstract Class. در دلفی Abstract Class وجود نداره، ولی می تونید کلاسی تعریف کنید که تمام متدهای آن Virtual و Abstract باشند. در صورت استفاده از این روش، تمام مزایای استفاده از Interface به غیر از Free شدن خودکار را داشتید.

البته تمام این ها در صورتی است که مجبور به استفاده از DLL باشید، وگرنه با استفاده از Package ها در دلفی می توان به راحتی یک کلاس را پیاده سازی کرد و از آن استفاده کرد.
lord_viper واقعا از کمکت متشکرم ولی اگه امکان داره یک فایل ضمیمه برام بزار
دقیقا این چیزایی که گفتی رو تو یه سورس دلفی برام بزار.
واقعا بازم دستت درد نکنه. خیلی ممنون.
منتظر فایل ضمیمه هستم.