PDA

View Full Version : سوال: نحوه ایجاد exception در dll



MVReza
جمعه 24 اردیبهشت 1395, 21:21 عصر
با سلام خدمت دوستان؛
من در حال نوشتن یک dll در دلفی هستم که مشکلی در raise یک exception خاص را دارم.

فرض کنین این تابع من هست:



function X(a, b: integer): real;
begin
if b = 0 then
raise Exception.Create('Division By Zero!')
else
Result := a / b;
end;


خب! من این تابع داخل dll رو از یک برنامه دلفی میتونم فراخونی کنم و نتیجه تابع و یا خطای مورد نظر رو دریافت کنم و اونرو داخل یک بلوک try...except بندازم و یک پیغام دیگه ای رو بجاش (در حالت بروز خطا) نشون بدم.

مشکل من اینجاست که میخوام این تابع رو از برنامه نوشته شده با C#‎‎‎‎‎‎‎‎ فراخوانی کنم. زمانی که اتظار مشاهده پیغام خطا در صورت پاس کردن مقدار 0 برای پارامتر دوم رو دارم، ویژوال استودیو خطای MarshalDirectiveException was unhandled میده. حال نمیدونم نحوه نوشتن تابع من توی dll غلطه و یا نحوه فراخوانی اون تو یه زبان دیگه مثلا C#‎‎‎‎‎‎‎‎.

انشاللاه کی تایپکم نابجا نباشه.
ممنون از راهنمایی دوستان.

Felony
شنبه 25 اردیبهشت 1395, 06:01 صبح
به دلیل ماهیت فایل های PE و ساختار اون ها نمیتونید به اون شیوه توقع هندل کردن Excpetion تولید شده در DLL رو در فایل اجراییتون داشته باشید .
راه درست برای تولید خطا در این شرایط برگرداندن یک کد خطا توسط تابع اجرا شده از DLL به فایل اجرایی فراخوان است .
اینجا کامل توضیح داده شده : http://stackoverflow.com/questions/27147353/catch-exception-thrown-from-delphi-dll-in-c-sharp

MVReza
سه شنبه 28 اردیبهشت 1395, 17:53 عصر
ممنون از پاسختون.
اما اگه بخوام یه Custom Exception تولید کنم باید چکار کنم؟ تو این حالت هم در c# خطای External component has thrown an exception میده!
یعنی میخام مثلا یک پیغام خاصی رو به عنوان خطا تولید کنم!
:ناراحت:

Felony
پنج شنبه 30 اردیبهشت 1395, 07:05 صبح
پیغام خاص یعنی چی ؟ اگر پیغام معلوم هست که تکلیف معلومه بهش یه کد اختصاص میدید و در برنامه دوم با توجه به کد ترجمش میکنید به متن مورد نظر .
اگر پیغام نامعلوم هست و بسته به شرایط و ... به صورت Runtime تولید میشه با روش های مختلفی میتونید به برنامه فراخوان پاسش بدید - مثلا pipe .

MVReza
پنج شنبه 30 اردیبهشت 1395, 20:08 عصر
تشکر از پاسخ شما؛
بله پیغام ثابت هست، ولی چون dll رو تنها خودم استفاده نمی‌کنم، به همین خاطر اختصاص کد و بازیابی اون در برنامه مقصد بی فایده میشه. میخوام در صورت امکان از داخل dll پیغام خطا رو raise کنم، تا در برنامه مقصد در صورت بروز خطا پیغام نمایش داده بشه و یا در صورت استفاده از تابع در داخل بلوک try...catch، نمایش پیغام دیگر و یا عملیات خاصی رو برنامه نویس انجام بده.
ضمنا مفهوم pipe رو متوجه نشدم. ممنون میشم اگه کمی در موردش توضیح بدین.

BORHAN TEC
پنج شنبه 30 اردیبهشت 1395, 21:14 عصر
پیاده سازی API در dll ها روش متفاوتی داره و نباید از exception ها استفاده بشه. برای کسب اطلاعات بیشتر به فصل اول کتاب Coding in delphi مراجعه کنید و حتماً مقالات مربوط به API Design از سری مجلات Blaise Pascal رو هم مطالعه کنید.