PDA

View Full Version : سوال: مشکل در ارسال پارامترها به توابع داخل MFC Library در حالت x64



Moharram
دوشنبه 03 شهریور 1399, 16:39 عصر
سلام
به یک مشکل در ارسال پارامترها به داخل توابع یک dll از نوع MFC Library برخورد کردم:

یک پروژه MFC Library ساختم و یک تابع به نام sum دارم که قراره دو تا int رو بگیره و جمعش رو تو خروجی return کنه ...

تو کامپایل 32 بیتی مشکلی نیست و برنامه فراخواننده dll خروجی درست رو دریافت می کنه، اما در حالت 64 بیتی جواب درست نیست! پارامترهای ورودی رو که داخل dll چاپ می کنم مقادیر درستی به داخل تابع نرفته و در نتیجه خروجی نادرست تولید شده!

جالبه که وقتی تابع رو به صورت Global و خارج از کلاس اصلی تعریف میکنم خروجی درست میشه ...؟

میتونه ربطی به calling convention و نحوه ارسال پارامترها به توابع dll داشته باشه؟

با تشکر

farhad_shiri_ex
دوشنبه 03 شهریور 1399, 19:54 عصر
سلام
به یک مشکل در ارسال پارامترها به داخل توابع یک dll از نوع MFC Library برخورد کردم:

یک پروژه MFC Library ساختم و یک تابع به نام sum دارم که قراره دو تا int رو بگیره و جمعش رو تو خروجی return کنه ...

تو کامپایل 32 بیتی مشکلی نیست و برنامه فراخواننده dll خروجی درست رو دریافت می کنه، اما در حالت 64 بیتی جواب درست نیست! پارامترهای ورودی رو که داخل dll چاپ می کنم مقادیر درستی به داخل تابع نرفته و در نتیجه خروجی نادرست تولید شده!

جالبه که وقتی تابع رو به صورت Global و خارج از کلاس اصلی تعریف میکنم خروجی درست میشه ...؟

میتونه ربطی به calling convention و نحوه ارسال پارامترها به توابع dll داشته باشه؟

با تشکر
بله البته که میتونه ارتباطی به calling convention در 64 بیتی داشته باشه، چون در 64 بیتی پارامترها توسط رجیسترها ارسال میشوند بنابراین امکان داره که مشکلی وجود داشته باشه
بهتره سورس تون را اینجا قرار میداید بهتر مشخص میشه
البته اگر دادهایی که لازم دارید را توسط یک استراکچر بسته بندی کنید و آفست استراکچر را به dll بدید، تو کتابخانه هم هر تغییری خواستید اعمال کنید اینطوری لازم نیست مقداری را هم return کنید هم بهینه تر هست و هم سریعتر از روش پاس دادن داده های خام
به این علت که فضای آدرس کتابخانه های shared با فضای آدرس باینری main متفاوت هست بنابراین آدرس دهی توسط GOT کلاک های بیشتری مصرف میکند، بنابراین ارسال آفست به فضای آدرس کتابخانه خیلی بهینه تر هست

Moharram
سه شنبه 04 شهریور 1399, 15:46 عصر
ممنون از پاسخی که دادید ...

البته سورس خاصی لازم نیست و با یک برنامه اولیه که خود ویزارد میده میشه همین حالت رو به وجود آورد. به این صورت که یک پروژه از نوع MFC Library درست میکنیم و یک تابع sum با دو ورودی و یک خروجی تعریف می کنیم، همین ...

البته مشکل در return تابع نیست و ظاهرا پارامترها درست منتقل نشدند.

یک باره دیگه بگم که در حالت 32 بیتی این مشکل نیست و همچنین تابع اگر Global باشه و داخل کلاس اصلی DLL نباشه باز هم این مشکل بوجود نمیاد!

ممنون

pe32_64
چهارشنبه 05 شهریور 1399, 22:54 عصر
تمام توبع dll حتما باید Global باشند.
در واقع برای یک dll استاندارد شما فقط میتونید توابعGlobalرو صادر کنید.
از کلاسهای mfc و با هر کلاس دیگری فقط باید در داخل تابع استقاده کنید و در بیرون توابع هبچ اثری از کلاس نباشه .
برا پارامتر ها و نوع بازگشتی فقط انواع استاندارد ویندوز باید استفاده کنبد وگرنه dll برا بقیه زبانهای برنامه نویسی غبر قابل استفاده میشه و دیگه استاندارد نیست.
حتما قبل نوشتن dll مستندات مایکروسافت در این ضمینه رو مطالعه کنید، تا این اشتباهات ابتدایی رخ نده براتون.