PDA

View Full Version : سوال: ساخت یک ارتباط با دی ال ال (از فایل اگزه)



nsco_nsco
سه شنبه 30 فروردین 1390, 10:16 صبح
سلام دوستان
من واقعیتش چند باری با مدل های متفاوت سوالاتی پرسیدم اما هنوز با این مشکل دارم
من می خوام یک عدد مثلا 5 رو درون فایل اگزم که می زنم بره تو دی ال ال چک کنه یعنی یک ایف و در صورت درست بودن مثلا ساعت سیستم رو نشون بده و اگر عدد دیگه ای بود مثلا نرم افزار رو ببنده واقعیتش ارتباط با دی ال ال از اگزه رو مشکل دارم ممنون می شوم کمک کنید لطفا سریع کمک کنید لطف می کنید با تشکر از همه شما:تشویق::قلب:

SAASTN
سه شنبه 30 فروردین 1390, 21:26 عصر
خوب دقیقا چیشو مشکل دارید؟ من برداشتم اینه که شما می خواید یه تابع توی DLL بنویسید که یه پارامتر داره و تابع بعد از بررسی پارامتر یه مقدار Boolean بر می گردونه. حالا این تابع از توی Exe صدا زده میشه و اگه خروجی True بود تاریخ و ... و اگه False بود برنامه بسته میشه.
برای تعریف تابع توی DLL که خوب تابعتون رو توی یکی از یونیت های DLL می نویسید، بعد برای اینکه تابع از Exe در دسترس باشه در انتهای همون یونیت قبل از end. می نویسید exports و بعد هم نام تابعتون و ;
برای فرا خوانی از داخل Exe بخش تعریف تابع رو دوباره در یونیتی که می خواید ازش استفاده کنید عینا با ذکر پارامترها و خروجی می یارید و بعد از ; می نویسید external و نام DLL داخل '' و ; .و بعد هم هر جا خواستید اون رو فراخونی می کنید:
یونیت مربوط به DLL:
unit UnitDLL;

interface

implementation

function CheckValue(const Value: Integer): Boolean;
begin
Result := Value = 5;
end;
exports
CheckValue;
end.

-------------
در محل فراخوانی تابع:
var
Form1: TForm1;

implementation

{$R *.dfm}

function CheckValue(const Value: Integer): Boolean; external 'ProjectDLL.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
if CheckValue(StrToInt(Edit1.Text)) then
Caption := TimeToStr(Now)
else
Application.Terminate;
end;

nsco_nsco
چهارشنبه 31 فروردین 1390, 02:12 صبح
سلام ممنون از پاسختون اما من دقیقا برعکس این ماجرا رو می خوام یعنی اون 5 رو داخل فایل اگزه باشه و اون ایف در دی ال ال و در اون دی ال ال تصمیم گرفته بشه که ساعت نشون داده بشه یا نه ممنون می شوم سریع کمک کنید با تشکر از همه شما

SAASTN
چهارشنبه 31 فروردین 1390, 09:02 صبح
من که اصلا نفهمیدم چی شد!

دقیقا برعکس این ماجرا رو می خوام
خوب تابع CheckValue رو توی پروژه اصلی تون پیاده سازی کنید و همون جا توی exports معرفی کنید و داخل DLL بصورت external استفاده کنید. این میشه برعکس ماجرای بالا که البته خیلی رایج نیست (البته من زیاد ندیدم). حالا نمی دونم مسئله اصلی شما روی بخش کار با DLL یعنی همین exports و externalه یا روی 5 و نمایش ساعت و ... مشکل دارید.
امکانش هست که یه توضیحی از کلیت کاری که می خواید بکنید بدید؟

nsco_nsco
چهارشنبه 31 فروردین 1390, 12:05 عصر
سلام ممنون از پاسختون در اصل من نمی دونم چطور بیام و یک مقدار رو که در اگزه وجود داره از دی ال ال بخونم من می خوام مثلا کار بر با زدن عددی در اگزه من در دی ال ال اون رو بخونم و در صورت درست بودن عمل خاصی رو صورت بدم ممنون می شوم کدش رو در ج کنید با تشکر :قلب:

SAASTN
چهارشنبه 31 فروردین 1390, 14:52 عصر
ببینید مقادیر بین یک فایل اجرایی وی یک DLL از طریق پارامترهای توابع و یا خروجی های اونها قابل انتقال هستند. حالا بستگی داره که یونیتی که حاوی این داده هست خودش شروع کننده ارتباط باشه یا یونیت مقابل. اگه مثلا داده در Exe باشه و خودش بخواداین ارتباط رو برقرار کنه، مقدار رو از طریق پارامتر برای DLL ارسال می کنه حالا یا بصورت "فراخوانی با مقدار" یا "فراخوانی با آدرس". ولی اگه DLL به این مقدار احتیاج داشته باشه باید تابعی در Exe پیاده سازی بشه تا DLL بتونه با فراخونی اون تابع به مقدار مورد نظر دسترسی پیدا کنه. مثلا فرض کنید ما در Exe یک متغیر سراسری به اسم CurrentValue داریم که DLL برای انجام محاسباتی بهش احتیاج داره پس برای این مورد باید تابعی در Exe ایجاد و export کنیم که کار خاصی انجام نمیده و تنها مقدار متغیر رو در اختیار میذاره. از طرفی اگر بخوایم مقدار این متغیر رو از داخل DLL تغییر بدیم هم باید یک روال بنویسیم که کار دیگه ای انجام نمیده غیر از این که این متغیر سراسری به مقدار جدیدی ست کنه.
var
CurrentValue: Integer;

function GetCurrentValue: Integer;
begin
Result := CurrentValue;
end;

procedure SetCurrentValue(NewValue: Integer);
begin
CurrentValue := NewValue;
end;

exports
GetCurrentValue, SetCurrentValue;

end.

حالا هر جایی که در DLL ما به مقدار این متغیر تعریف شده در Exe نیاز داشته باشیم کافیه که GetCurrentValue و یا SetCurrentValue رو فراخوانی کنیم.