black-scorpion
تازه وارد
ارسالها: 16
موضوعها: 5
تاریخ عضویت: خرداد ۱۳۸۶
تشکرها : 0
( 2 تشکر در 1 ارسال )
|
تعریف کلاس در dll و استفاده از آن در exe (حیاتی)(حیاتی) لطفا کمک کنید
چطور میشه یک کلاس رو در یک فایل dll توسط دلفی نوشت
و بعد از آن در یک برنامه به زبان دلفی استفاده کرد.
مثل استفاده از یکسری dll ها که در قسمت type library
دلفی ازشون استفاده میشه.
این پروژه برام خیلی مهمه چون میخام از کلاسم که در دلفی
می نویسم در دلفی ، سی و یا زبانهای دیگه استفاده
دوستان خواهش میکنم کمک کنید. ممنون
|
|
۱۸-آبان-۱۳۸۶, ۱۷:۲۹:۳۶ |
|
تشکر شده توسط : |
|
black-scorpion
تازه وارد
ارسالها: 16
موضوعها: 5
تاریخ عضویت: خرداد ۱۳۸۶
تشکرها : 0
( 2 تشکر در 1 ارسال )
|
RE: تعریف کلاس در dll و استفاده از آن در exe (حیاتی)(حیاتی) لطفا کمک کنید
یعنی هیچ کس نمی دونه چطوری میشه یک کلاسو در دی ال ال تعریف کرد؟
یعنی یک کلاس در دی ال ال تعریف بشه و بعد در برتانه ازش استفاده بشه
من توی سی شارپ می تونم ولی با دلفی نمی تونم
لطفا کمک کنید.
|
|
۲۲-آبان-۱۳۸۶, ۲۲:۴۲:۱۵ |
|
تشکر شده توسط : |
|
black-scorpion
تازه وارد
ارسالها: 16
موضوعها: 5
تاریخ عضویت: خرداد ۱۳۸۶
تشکرها : 0
( 2 تشکر در 1 ارسال )
|
RE: تعریف کلاس در dll و استفاده از آن در exe (حیاتی)(حیاتی) لطفا کمک کنید
محمد جان من ساخت توابع و استفاده از اونها رو در دلفی
می دونم و حتی چندین دی ال ال تو دلفی نوشتم من میخام
یک کلاس رو در دی ال ال پیاده سازی کنم، لطفا توضیحات رو
قشنگ بخونید.
در هر صورت از کمک شما متشکرم.
|
|
۲۴-آبان-۱۳۸۶, ۱۳:۴۹:۱۰ |
|
تشکر شده توسط : |
|
lord_viper
مدیر کل انجمن
ارسالها: 3,949
موضوعها: 352
تاریخ عضویت: بهمن ۱۳۸۴
تشکرها : 5193
( 9875 تشکر در 2650 ارسال )
|
RE: تعریف کلاس در dll و استفاده از آن در exe (حیاتی)(حیاتی) لطفا کمک کنید
برای این کار می تونید یک 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 ها در دلفی می توان به راحتی یک کلاس را پیاده سازی کرد و از آن استفاده کرد.
|
|
۲۵-آبان-۱۳۸۶, ۱۰:۰۴:۰۶ |
|
تشکر شده توسط : |
|
black-scorpion
تازه وارد
ارسالها: 16
موضوعها: 5
تاریخ عضویت: خرداد ۱۳۸۶
تشکرها : 0
( 2 تشکر در 1 ارسال )
|
RE: تعریف کلاس در dll و استفاده از آن در exe (حیاتی)(حیاتی) لطفا کمک کنید
lord_viper واقعا از کمکت متشکرم ولی اگه امکان داره یک فایل ضمیمه برام بزار
دقیقا این چیزایی که گفتی رو تو یه سورس دلفی برام بزار.
واقعا بازم دستت درد نکنه. خیلی ممنون.
منتظر فایل ضمیمه هستم.
|
|
۲۵-آبان-۱۳۸۶, ۲۲:۰۷:۱۸ |
|
تشکر شده توسط : |
|