PDA

View Full Version : سوال: چگونگی فراخوانی دی ال ال به صورت پویا در برنامه اگزه



nsco_nsco
سه شنبه 21 دی 1389, 00:00 صبح
خوب فرض کنید ما یک دی ال ال به صورت پویا نوشتیم و می خواهیم که آن را در یک فایل اگزه فراخوانی نماییم البته تنها یک تابع را و باز فرض کنید که نام تابع ali است و در این تابع یک نوشته مثلا (( سلام شما خوبید )) قرار دارد و یا (( 2010)) خوب و پس از فراخوانی می خواهیم در یک لیبل به نام لیبل یک نمایش دهیم . همین رو می خواهم مممنون از همه شما لطفا در صورت امکان سریع پاسخ دهید . و لطفا خودتون یکی برام بنویسید و نگید که اینجوری هست و یا در سایت دیگری بیارید و یا تاپینگ دیگر ممنون .:تشویق::چشمک:

ممنون از شما تنها توجه کنید از نام متغییر های آسان استفاده کنید تا فهم این مسئله اسان شود
و حتما بخش به بخش یعنی دستور به دستور توضیع دهید و جوری بگویید که در صورت تغییر مثلا تغییر دستورات را در انواع نوشتن ذکر کنید .

BORHAN TEC
سه شنبه 21 دی 1389, 17:25 عصر
سلام، :لبخند:

برای ساخت dll یک پروژه از نوع Dynamic Link Library ایجاد کنید و از کد زیر در آن استفاده کنید:

library Project1;

uses
SimpleShareMem,
SysUtils,
Classes;

{$R *.res}

function SayWelcome: string; stdcall;
begin
Result := 'سلام شما خوبید';
end;

exports
SayWelcome;
begin
end.

سپس یک پروژه از نوع VCL Form App ایجاد کنید و یک دکمه بر روی فرم بیاندازید و در آن از کد زیر استفاده کنید:

procedure TForm1.Button1Click(Sender: TObject);
type
TSayWelcome = function: string;
var
DLLInstance: THandle;
SayWelcome: TSayWelcome;
begin
DLLInstance := LoadLibrary('Project1.dll');
try
if DLLInstance = 0 then
begin
ShowMessage('Unable to load DLL');
exit;
end;
@SayWelcome := GetProcAddress(DLLInstance, 'SayWelcome');
if @SayWelcome <> nil then
ShowMessage(SayWelcome)
else
ShowMessage('Unable to locate function');
finally
FreeLibrary(DLLInstance);
end;

end;
حالا شما موقعی که بر روی این دکمه کلیک می کنید بعد از نمایش پیام موردنظر با یک استثنا مواجه می شوید. برای رفع این مشکل به یونیت اصلی پروژه بروید و یونیت SimpleShareMem را به ابتدای فهرست uses اضافه کنید. مانند قسمت زیر:

program Project2;

uses
SimpleShareMem, Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;

end.
توجه داشته باشید که فایل exe و dll ایجاد شده را در کنار هم قرار بدهید. چون با این کار دیگر نیازی به ثبت فایل dll ندارید.

یا حق...

nsco_nsco
سه شنبه 21 دی 1389, 21:44 عصر
سلام دوست من ممنون از پاسختون باور نمی کنین چقدر وقته هی من مثال می زنم و میپرسم والا نتونستم حالی بچه های تالار کنم دیگه داشتم دیوانه می شدم:خجالت: ممنون بلاخره به واسطه شما من جواب گرفتم دوست من تنها یک سوال من العان که گفتید این فایلها را قرار دادم اما پس از اجرای برنامه و زدن دکمه هیچی در صفحه پیغام که باز میشه نمیاد و بعد از اوکی کردن برنامه قفل میکنه و بسته می شه اگر ممکنه یک نگاهی بهش بندازید ببینید مشکل کجاست در ضمن در صورت امکان اگر ممکنه متغییر را نیز در یک لیبل نمایش دهید ممنون چون من نمی دونم چطوری بنویسم که بره تو یک لیبل ممنون


راستی این نوع معرفی یعنی چی ؟ SayWelcome: TSayWelcome;
و چرا اول فانکشن معرفی متغییر را T می گذارید . مثلا اول TSayWelcome = function: string;
و باز چرا از اتساین @ برای متغییر استفاده می کنید ؟ و معنی nil چیست؟ مثال @ if @SayWelcome <> nil then
چرا از SimpleShareMem باید استفاده کرد ؟
چه متغییرهایی را می توان در یک دی ال ال برای نمایش و استفاده از دی ال ال نوشت؟ از چه نوعی یعنی
چگونه می توان یک تابعی ساخت که مثلا عدد 10 را از اگزه بر روی دی ال ال بریزد و ذخیره شود حتی بعد از بستن برنامه این عدد در دی ال ال باشد ؟


ممنون دوستان خوبم و مخصوصا شاهین عشایری و علی کشاورز و تاجیک و ... بقیه که اسماتون رو بلد نیستم لطفا هر چه سریع تر بهم جواب بدید و حتما مثال فرامش نشه با تشکر خیلی خیلی خیلی فراوان . :قلب::لبخند::تشویق::لبخندساد :

vcldeveloper
سه شنبه 21 دی 1389, 22:04 عصر
function SayWelcome: string; stdcall;


TSayWelcome = function: string;
تعریف توابع باید در DLL و برنامه فراخوان یکسان باشه. اینجا متوجه خطا نشدید، چون تابع شما پارامتری جز مقدار خروجی خودش نداشت. اگر پارامتر داشت، با مشکل مواجه می شدید.
در ضمن، استفاده از stdcall زمانی توجیه داره که بخواید این DLL رو با برنامه هایی که با زبان های مختلفی نوشته شدند، به اشتراک بزارید. وقتی تابع DLL شما string برگشت میده، و شما از ShareMem یا SimpleShareMem استفاده می کنید، دیگه استفاده از stdcall توجیه نداره.


توجه داشته باشید که فایل exe و dll ایجاد شده را در کنار هم قرار بدهید. چون با این کار دیگر نیازی به ثبت فایل dll ندارید.
یک DLL معمولی ویندوز نیاز به ثبت نداره، فقط باید در مسیری باشه که توسط سیستم عامل قابل پیدا کردن باشه. اون اشیاء COM و ActiveX ها هستند که نیاز به ثبت دارند.

nsco_nsco
سه شنبه 21 دی 1389, 22:55 عصر
سلام ممنون

ممنون اقای کشاورز با پاک کردن این این دستور در دی ال ال مشکل حل شد باور می کنید فراموش کرده بودم در سوال قبلم اون فایل را ضمیمه کنم :قهقهه: :لبخند: ببخشید اما اگر ممکن هست نیز در مورد سوالات دیگر کمک کنید با تشکر (( دوستان دیگری هم که می داند در راجب این سوالات کمک کنن با تشکر فراوان)):تشویق::لبخندساده:

vcldeveloper
سه شنبه 21 دی 1389, 23:52 عصر
راستی این نوع معرفی یعنی چی ؟ SayWelcome: TSayWelcome;
و چرا اول فانکشن معرفی متغییر را T می گذارید . مثلا اول TSayWelcome = function: string;
این سوال ارتباطی با لود کردن DLL نداره. برای همچین موضوعی، بهتر هست به کتب آموزشی دلفی یا پاسکال مراجعه کنید. پیشوند T در دلفی، پیشوند متداول برای نوع ها (Types) هست. TSayWelcome هم یک Type هست که تعریف یک تابع را مشخص میکنه.


و باز چرا از اتساین @ برای متغییر استفاده می کنید ؟ و معنی nil چیست؟ مثال @ if @SayWelcome <> nil then
این دو سوال هم مثل سوال اول، در کتب آموزشی دلفی جوابشان پیدا میشه. عملگر @ آدرس حافظه داده درج شده بعد از این عملگر را برگشت میده.
nil به معنی پوچ یا "فاقد محتوا" بودن هست، و برای اشاره گرها به کار میره. اشاره گری که به حافظه ایی اشاره نمیکنه، مقدارش nil هست.


چرا از SimpleShareMem باید استفاده کرد ؟
وقتی یک پروژه DLL در دلفی ایجاد می کنید، یک comment طولانی به طور خودکار در پروژه شما درج میشه. در اون comment توضیحاتی درباره استفاده از ShareMem (برای شما SimpleShareMem) داده شده. من قبلا در همین سایت درباره اش توضیح دادم:
http://barnamenevis.org/showthread.php?263995-%D8%AE%D8%B7%D8%A7-%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1-%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%D9%87-%D9%85%D8%AA%D8%BA%DB%8C%D8%B1-%D9%86%D9%88%D8%B9-%D8%A2%D8%B1%D8%A7%DB%8C%D9%87-%D8%A7%DB%8C-%D8%AF%D8%B1-DLL&p=1169700&viewfull=1#post1169700



چگونه می توان یک تابعی ساخت که مثلا عدد 10 را از اگزه بر روی دی ال ال بریزد و ذخیره شود حتی بعد از بستن برنامه این عدد در دی ال ال باشد ؟
DLL یک ماجول حاوی کدهای اجرایی، یا داده های ثابت (به صورت const یا resource) هست. DLL یک منبع ذخیره سازی داده های متغیر نیست که شما از EXE بهش مقدار بدید، و در DLL ثبت بشه. برای اینطور کارها می تونید از فایل های معمولی با فرمتی که خودتان مایلید استفاده کنید.

در پایان، اگر یک نگاهی به لیست تاپیک هایی که با برچسب DLL علامتگزاری شدند، بیاندازید (اکثرشان مربوط به بخش دلفی هستند)؛ مثال ها و توضیحات زیادی درباره نحوه کار با DLLها و ساخت DLL در دلفی پیدا می کنید:
http://barnamenevis.org/tags.php?tag=DLL

nsco_nsco
چهارشنبه 22 دی 1389, 01:52 صبح
ببخشید ممنون از جوابتون اقای کشاورز تنها یک سوال

من چطوری می توانم یک لیبل برای نمایش متغییر استفاده کنم فرض کنید Label12.Caption:= من در ادامه چطوری باید این متغییر ShowMessage(SayWelcome) به این صورت هست را در لیبل به نمایش بگذارم ممنون از همه شما:خجالت:

vcldeveloper
چهارشنبه 22 دی 1389, 12:29 عصر
من چطوری می توانم یک لیبل برای نمایش متغییر استفاده کنم فرض کنید Label12.Caption:= من در ادامه چطوری باید این متغییر ShowMessage(SayWelcome) به این صورت هست را در لیبل به نمایش بگذارم

Label12.Caption := SayWelcome;