PDA

View Full Version : DLL Access Violation



امید امرایی
یک شنبه 26 آبان 1387, 18:02 عصر
با سلام

بنده توابع زيادي رو در يك DLL تعريف كردم اما تنها در زمان فراخواني يكي از توابع كه سه بار overload شده با خطاي Access Violation رو برو مي شم

Signature توابع در dll :


function ValueToStr(Value: Integer): String; overload; export;
begin
try Result := IntToStr(Value); except Result := '0'; end;
end;

function ValueToStr(Value: Double): String; overload; export;
begin
try Result := FloatToStr(Value); except Result := '0'; end;
end;

function ValueToStr(Value: Extended): String; overload; export;
begin
try Result := FloatToStr(Value); except Result := '0'; end;
end;
جستجويي هم انجام دادم ولي راه حلي پيدا نكردم.

متن خطا به اين شكله :


Access violation at address 004B4C84 in module 'file.dll' . Write of address .....


با تشكر

دنیای دلفی
دوشنبه 27 آبان 1387, 10:24 صبح
بله حتما هم با خطا مواجه مي شويد .
نكته بسيار مهم :
تحت هيچ شرايطي از String در Export مربوط به DLL ها استفاده نكنيد اگر تعداد كاركترهاي شما كم است از ShortString و اگر زياد است از PChar استفاده كنيد .

مشكل شما حل مي گردد

امید امرایی
دوشنبه 27 آبان 1387, 10:52 صبح
بسيار ممنون از توجه شما . حق با شماست

بنده مطالعه كرده بودم كه بين اين مسئله و استفاده از ShareMem بايد ارتباطي باشه .
آيا واقعا به اين شكل هست ؟

و نكته قابل تامل ديگه اينه كه اين مشكل فقط در صورت Overload شدن اين توابع ايجاد مي شه و غير از اين مشكلي وجود نداره.

دنیای دلفی
دوشنبه 27 آبان 1387, 12:47 عصر
معمولا با يكي دو متغيير از نوع String مشكلي پيش نمي آيد . و دربعضي از موارد اگر ميزان حافظه مصرفي و Memory Share زياد نباشد حتي مشكلي پيش نمي آيد . ولي اين نكته بسيار مهم است تا جايي كه امكان دارد در Export در DLL از توابعي كه String هستند استفاده نشود .

vcldeveloper
دوشنبه 27 آبان 1387, 18:14 عصر
معمولا با يكي دو متغيير از نوع String مشكلي پيش نمي آيد . و دربعضي از موارد اگر ميزان حافظه مصرفي و Memory Share زياد نباشد حتي مشكلي پيش نمي آيد . ولي اين نكته بسيار مهم است تا جايي كه امكان دارد در Export در DLL از توابعي كه String هستند استفاده نشود .
با شاید و اما و اگر پایداری برنامه تضمین نمیشه! هیچ وقت نباید بدون استفاده از مکانیزم ارائه شده، از نوع داده های دلفی که بطور خودکار مدیریت میشند (مثل string یا dynamic array) به عنوان پارامتر یا مقدار خروجی در توابع export شده DLL استفاده کرد.

امید امرایی
دوشنبه 27 آبان 1387, 19:14 عصر
بله در مورد خروجي String قطعا حق با شما دوستانه.
اما مشكل بروز خطا به اين مسئله مربوط نمي شه و حتي با استفاده از PChar هم مشكل پا برجاست .
همونطور كه پيش از اين هم عرض كردم ، اين مشكل در صورت overload شدن اين متد پيش مياد و در صورتي كه overload نشه هيچ اشكالي وجود نداره .

دنیای دلفی
دوشنبه 27 آبان 1387, 22:57 عصر
اگر مي خواهيد مشكلتون كامل حل بشه DLL را به صورت Dynamic فراخواني كنيد و بلافاصله بعد از استفاده از تابع مربوطه آن را آزاد كنيد . مطمئن باشيد مشكلتون حل ميشه .

دنیای دلفی
دوشنبه 27 آبان 1387, 23:08 عصر
اگر مي خواهيد مشكلتون كامل حل بشه DLL را به صورت Dynamic فراخواني كنيد و بلافاصله بعد از استفاده از تابع مربوطه آن را آزاد كنيد . مطمئن باشيد مشكلتون حل ميشه .

امید امرایی
سه شنبه 28 آبان 1387, 15:09 عصر
اگر مي خواهيد مشكلتون كامل حل بشه DLL را به صورت Dynamic فراخواني كنيد و بلافاصله بعد از استفاده از تابع مربوطه آن را آزاد كنيد . مطمئن باشيد مشكلتون حل ميشه .

بله حق با شما بود