ورود

View Full Version : خطا در بکار گیری DLL



sara66
سه شنبه 23 تیر 1388, 13:25 عصر
برای ارتباط با دستگاه کارت خوان یک dll هست ... یه مثال هم از کارکرد dll موجوده
وقتی میخوام dll را به برنامه ایمپورت کنم ارور میده . اومدم فایل dll و pas همنام با dll را که تو مثال بود تو پوشه پروزه خودم کپی کرم و تو برنامه نام اون فایل pas را تو uses نوشتم و یکی از توابع فایل را تو برنامه استفاده کردم
موقع کامپایل مشکلی نداره ولی در زمان اجرا وقتی اون تابع اجرا میشه ارور میده :
access violation at address ..... تو ارورش اسم اون dll هم هست

برای چی اینجوری میشه ؟ آخه مثال خودش بدون هیچ مشکلی کار میکنه

sara66
چهارشنبه 24 تیر 1388, 08:00 صبح
کسی نمیدونه مشکل کجاست ؟

vcldeveloper
چهارشنبه 24 تیر 1388, 18:40 عصر
مشکل میتونه از خیلی چیزها باشه، خطایی که دریافت می کنید خیلی کلی هست. اگر مشکل در داخل DLL باشه، شما نمی تونید کار خاصی درباره اش بکنید. اگر مشکل از طرف شما باشه، باید به مستندات دستگاه رجوع کنید. مثلا ممکن هست آنجا قید شده باشه که قبل از فراخوانی هر یک از توابع، باید تابع خاصی را برای مقداردهی اولیه دستگاه فراخوانی کنید، یا ترتیبی برای اجرای توابع در نظر گرفته باشه. از طرف دیگه، ممکن هست پارامترهای ارسالی به تابع را درست مقداردهی نکرده باشید.

sara66
چهارشنبه 24 تیر 1388, 18:51 عصر
مرسی
تو مثال خودش همین dll کار میکنه و من دقیقا سورس خودش را کپی کردم تو یک پروژه جدید
اصلا برای استفاده از یک dll باید چکار کرد ؟ از منوی projectاومدم import کنم که ارور داد

vcldeveloper
پنج شنبه 25 تیر 1388, 00:46 صبح
اصلا برای استفاده از یک dll باید چکار کرد ؟ از منوی projectاومدم import کنم که ارور داد بستگی داره اون DLL چی باشه؛ اگر فرضا یک شی COM هست، باید روی سیستم نصب بشه. اگر DLL معمولی هست، نیازی به نصب نداره، فقط کافیه DLL لود بشه، و توابع داخلش فراخوانی بشه. لود کردن DLL هم به دو شکل هست: Static و Dynamic. هر دو حالت هم قبلا در همین تالار توضیح داده شدند.

در مورد شما، با توجه به اینکه گفتید یک فایل PAS هم به همراه DLL دریافت کردید، احتمالا خودش یک فایل Interface دلفی برای DLL درست کردند، تا شما زحمت لود کردن DLL و فراخوانی توابع آن را هم نکشید، و به ازاء هر تابع موجود در DLL یک تابع متناظر در این فایل PAS وجود داره، که نهایتا همان تابع موجود در DLL را فراخوانی میکنه.

sara66
پنج شنبه 25 تیر 1388, 09:12 صبح
از این ساعت فقط یک سورس دلفی دارم که بدون مشکل کار میکنه. تو پوشه سورس برنامه را نگاه کردم یک dll بود و 2 تا فایل dcu , pas همنام با فایل dll. تو برنامه هم مثلا برای تنظیم تاریخ دستگاه یک تابع را صدا زده اون تابع داخل فایل pas همنام با dll بود داخل فایل pass را نگاه کردم تابع اینجوری نوشته شده بود:



procedure SetDateTime(AComIP: String; Address: Integer; var DateTimeStr:TDateTimeStr); stdcall ;external 'ST_2000.DLL'


من همون سورس مربوط به تغییر ساعت را تو یک پروژه جدید کپی کردم اون 3 تا فایل هم تو پوشه پروژه ریختم و فایل pas را تو uses نوشتم اما موقع اجرا اون ارور را میده . همین سورس تو پروژه خودش کار میکنه

اینم سورس برنامه : http://www.speedyshare.com/446689202.html
ممنون میشم اگه کمکم کنید

vcldeveloper
پنج شنبه 25 تیر 1388, 15:54 عصر
خب کدی که شما نوشتید کجا ست؟

sara66
پنج شنبه 25 تیر 1388, 20:21 عصر
مرسی که نگاه کردید. راستش تا شنبه نمیتونم سورس را بذارم آخه شرکت تعطیل
ولی سورس چیز خاصی نداشت یه پروژه جدید درست کردم و فایلهای dll و pas و dcu همنام با dll را (که تو پوشه برنامه نمونه بود ) داخل پوشه همین پروژه جدید ریختم. تو سورس برنامه و در قسمت uses نام فایل pas را نوشتم



uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, DBCtrls, DBTables, Mask, DB, Grids, DBGrids, ST_2000, ADODB;


و یه باتوم رو صفحه گذاشتم و تو آن کلیکش اینا رو نوشتم :




var
S1,S2: String;
I: Integer;
DT: TDateTimeStr;
begin
S1 := Copy(MaskEdit1.Text, 1, 10);
S2 := MaskEdit2.Text;
StrPCopy(@DT.DateStr, S1);
StrPCopy(@DT.TimeStr, S2);
SetDateTime('2',1,DT);
end;




تو پروژه خودش دقیقا همین باتوم را با همین سورس ایجاد کردم و کار کرد , ولی تو پروژه خودم کار نمیکنه

vcldeveloper
جمعه 26 تیر 1388, 12:27 عصر
تو پروژه خودش دقیقا همین باتوم را با همین سورس ایجاد کردم و کار کرد , ولی تو پروژه خودم کار نمیکنه
توی پروژه خودش در هنگام شروع به کار برنامه یک سری از توابع DLL برای مقداردهی اولیه فراخوانی میشند، مثل ClearCMOS، یا AddCom، یا SetDeviceType، و غیره. آیا شما هم این مقداردهی اولیه را در پروژه خودتان انجام میدید؟
در سورسی که ارسال کردید، کدهای مربوط به مقداردهی اولیه در متد FillComs از کلاس TfrmClockDump وجود دارند. FillComs در FormCreate همان کلاس فراخوانی می شود.

sara66
شنبه 27 تیر 1388, 08:37 صبح
مرسی آقای کشاورز این چند تا تابع را اولیه را نوشتم درست شد . لطف کردید
یک سوال دیگه , چجوری میشه فهمید تو فایل dll چه توابعی نوشته شده ؟ آخه اون فایل pas بعضی از توابع را به صورت توضیحات در آورده

vcldeveloper
شنبه 27 تیر 1388, 11:40 صبح
یک سوال دیگه , چجوری میشه فهمید تو فایل dll چه توابعی نوشته شده ؟
با بررسی لیست export اون DLL میشه اسم توابعی که در اختیار برنامه ها قرار میده را بدست آورد. برای این کار نرم افزارهایی وجود دارند، مثل dllexp از Nir Soft.

Diabolic
شنبه 27 تیر 1388, 11:44 صبح
من یه برنامه با نام DLLExport دارم که برای اینکاره و با دلفی هم نوشته شده
کسی سورس اون رو نداره ؟

sara66
شنبه 27 تیر 1388, 13:35 عصر
مرسی
نصب کردم و توابع موجود در dll را نشان داد