PDA

View Full Version : ارسال و دریافت پارامتر در dll



mehdi.fni
سه شنبه 27 مهر 1389, 11:43 صبح
دوستان
من از یک برنامه نمونه ساده ا به dll مقصد یک پارمتر میفرستم ومیخوام از اون پارمتر در dll استفاده کنم
ولی داخل dll استرینگی که میفرستم به چند کارکتر غیر متعارف تبدیل میشه
کسی میتونه کمک کنه ؟
شاید شما هم به این مشکل بر بخورید
سورس برنامه و dll هم که با دلفی نگارش 7 نوشته شده پیوست میکنم

حمیدرضاصادقیان
سه شنبه 27 مهر 1389, 13:28 عصر
سلام؛

اولین مشکلش اینه که Calling Convention تابع باید هم در DLL و هم در برنامه فراخوان آن یکسان باشه؛ ولی در کد شما، تابع در داخل DLL به صورت stdcall تعریف شده، اما در برنامه فراخوان بدون ذکر stdcall تعریف شده، و این یعنی استفاده از حالت پیش فرض دلفی که register هست.

دومین مشکلش این هست که شما خروجی تابع را در DLL به صورت string تعریف کردید، اما در برنامه فراخوان به صورت Integer.

اگر خروجی تابع را در هر دو پروژه Integer تعریف کنید، و Calling Convention تابع را هم در هر دو جا یکسان کنید، مشکلتون برطرف میشه.

موفق باشید

mehdi.fni
سه شنبه 27 مهر 1389, 14:20 عصر
جناب آقای صادقیان از راهنمایی شما تشکر میکنم
بنده مبتدی هستم
خواهشمندم در صورت امکان مشکل ارسال پارامتر را اصلاح کنید
البته نمونه فوق را بارها اصلاح کرده ام نشده است چند روزه سر کارم و آخری را با عجله فرستادم که خالی از اشکال نیست و تمام پارمترها را یکی هم داده بودم که نشده بود .
حالا اگر امکان داره شما منت بگذارید و اطلاح شده آنرا برای همه upload کنید
با آرزوی موفقیت برای شما عزیزان و سروران گرامی

حمیدرضاصادقیان
سه شنبه 27 مهر 1389, 14:45 عصر
سلام.
اینم کد اصلاح شده.
موفق باشید

mehdi.fni
چهارشنبه 28 مهر 1389, 07:42 صبح
قدردان محبت شما هستم .:تشویق:
یک سئوال:متفکر:
اگر میخواستم پارامتر ارسالیم از نوع آرایه و یا رکورد تعریف کنم باید پی مینوشتم ؟:خجالت:

vcldeveloper
چهارشنبه 28 مهر 1389, 10:22 صبح
اگر میخواستم پارامتر ارسالیم از نوع آرایه و یا رکورد تعریف کنم باید پی مینوشتم
بستگی داره که اون آرایه یا رکورد چی باشه...

برای آرایه های استاتیک و رکوردهای معمولی، کافی آنها را در یک یونیت جداگانه تعریف کنید؛ و آن یونیت را هم در پروژه DLL و هم در برنامه use کنید.

اما اگر آرایه از نوع دینامیک باشه، یا رکورد حاوی فیلدهایی از نوع خاص مثل string یا آرایه دینامیک باشه، اون وقت باید علاوه بر کار بالا، یونیت ShareMem هم به ابتدای بخش uses فایل DPR هر دو پروژه اضافه بشه. DLL شما هم فقط از داخل برنامه های دلفی قابل دسترس خواهد بود. به همراه برنامه هم باید فایل BoralndMM.dll را به سیستم کاربر کپی کنید.

alinikaein
چهارشنبه 28 مهر 1389, 17:25 عصر
اما اگر آرایه از نوع دینامیک باشه، یا رکورد حاوی فیلدهایی از نوع خاص مثل string یا آرایه دینامیک باشه، اون وقت باید علاوه بر کار بالا، یونیت ShareMem هم به ابتدای بخش uses فایل DPR هر دو پروژه اضافه بشه. DLL شما هم فقط از داخل برنامه های دلفی قابل دسترس خواهد بود. به همراه برنامه هم باید فایل BoralndMM.dll را به سیستم کاربر کپی کنید.

چطوري مي‌شه كاري كرد كه DLL ما از داخل برنامه‌هاي ساير زبان‌ها نيز قابل دسترسي باشه؟

ممنون.

vcldeveloper
جمعه 30 مهر 1389, 16:36 عصر
چطوري مي‌شه كاري كرد كه DLL ما از داخل برنامه‌هاي ساير زبان‌ها نيز قابل دسترسي باشه؟
باید نوع داده ورودی و خروجی توابع اون DLL و Calling Convention آنها برای سایر زبان ها قابل درک باشه.