ورود

View Full Version : سوال: Using Delphi's widestring in VC++



mf_417
شنبه 03 اسفند 1387, 12:46 عصر
سلام

من یک dll دارم که با delphi نوشته شده و تابع زیر را Export کرده:



WideString __stdcall _Get_CurrDevSerial();
در VC++ بصورت زیر آنرا فراخوانی می کنم:



typedef __declspec(dllimport) BSTR* (__stdcall *Get_CurrDevSerial_t)();

Get_CurrDevSerial_t gcds = (Get_CurrDevSerial_t) GetProcAddress (hDll, "_Get_CurrDevSerial");

if (gcds)
gcds();


که به مجرد فراخوانی آن خطایی مبنی بر این که از Calling Convension اشتباه استفاده کردم دریافت می نمایم در حالی که در هر دو از stdcall استفاده نموده ام.

مشکل فقط با widestring است و توابع ای که int برمی گردانند بطور کامل و درست فراخوانی می شوند و مقدار درست هم بر می گردانند.

البته من فقط من باب تست بقیه convension ها را هم تست کرده ام که فرقی نکرد و قاعدتا اگر مشکل مربوط به stdcall می بود نمی باست بقیه توابع هم کار کنند.

به همین دلیل فکر می کنم مساله مربوط به widestring می باشد.

کسی نمی داند معادل widestring دلفی در Visual C++ چیست؟؟

لطفا راهنمایی کنید.

Nima_NF
دوشنبه 05 اسفند 1387, 01:55 صبح
اگر پروژه را به صورت run-time لود می کنید نیازی به __declspec(dllimport نیست، فقط تابع را به همان شکل تعریف کنید و LoadLibrary را استفاده کنید.

- اگر رشته wide بر می گردانید، باید در تنظیمات کامپایلر نوع پروژه را unicode تنظیم کنید.
- مقدار برگشتی تابع را به جای BSTR باید معادلی در ++C تعریف کنید، مثلا LPTSTR برای اشاره گری به رشته wide و اسکی.

در هر حال می توانید از اشاره گری به char برای اسکی و یا از wchar_t برای اشاره گری به رشته wide استفاده کنید.

- دقت کنید که هر جایی که از نوشته با " " استفاده می کنید باید از L یا _T یا TEXT استفاده کنید تا آن را یونیکد در نظر گیرد:



GetProcAddress (hDll, TEXT("_Get_CurrDevSerial") );

mf_417
دوشنبه 05 اسفند 1387, 07:59 صبح
خیلی ممنون از پاسخ

راه حل شما را تست کردم ولی نتیجه نداد.

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

ببینید من یک dll دارم که با دلفی نوشته شده است و این dll مقادیر رشته ای را توسط نوع داده ای widestring دلفی (و نه vc) بر می گرداند. وقتی جستجو کردم متوجه شدم که تنها معادل آن در vc نوع رشته BSTR است.

و البته مساله به همین سادگی هم نیست، من فکر می کنم که declration تابع export شده توسط دلفی در VC++ جور دیگری است. یعنی مشابه روش ای که COM برای انتقال مقدار بازگشتی استفاده می کند (مقدار بازگشتی اصلی را توسط پارامتر های ورودی تابع برمی گرداند و مقدار بازگشتی تابع فقط کد خطای HRESULT است)

البته این نوع اعلان را هم تست کردم ولی جواب نگرفتم.

ابزاری وجود ندارد که یک dll را باز کند و یک فایل .h برای VC++ بدهد؟ یا اینکه مشخص کند پارامتر های و نوع داده بازگشتی یک export خاص آن چیست؟

Nima_NF
دوشنبه 05 اسفند 1387, 12:39 عصر
BSTR همان LPTSTR هست و هر دوی آن ها یک define ساده از نوع wchar_t هست. پس فرق ندارد.

شما دو چیز را مشخص نکردید:
1) کدام نسخه ++VC را استفاده می کنید؟
2) آیا پروژه را به صورت unicode کامپایل می کنید؟

WideString در دلفی کلاس هست یا یک تعریف ساده از نوع داده ای خاصی ؟ اگر کلاس هست و متدی دارد که مستقیم فقط اشاره گری به رشته برگرداند همواره سعی کنید از آن استفاده کنید تا با تمامی زبان ها و ++C/C استاندارد سازگار باشد.



ابزاری وجود ندارد که یک dll را باز کند و یک فایل .h برای VC++ بدهد؟ یا اینکه مشخص کند پارامتر های و نوع داده بازگشتی یک export خاص آن چیست؟خیر، هدف dll همین هست که تا زمانی که کسی dll برای خودش نیست به پارامترها دسترسی نداشته باشد.

mf_417
دوشنبه 05 اسفند 1387, 16:28 عصر
vc6
unicode

البته mbcs را هم تست کردم

توی help دلفی که گفته widestring یه جور کلاسه که refrence count و از این جور چیز ها داره

البته مشکل ام با یه راه دیگه حل شد: از ActiveX مربوط به اون سخت افزار استفاده کردم و کار کرد.

به هر حال متشکرم.