سؤال

لدي ويندوز DLL التي كتبت مكتوب في C/C++ (تصدير جميع المهام 'C').DLL يعمل بشكل جيد بالنسبة لي في VC++.لقد أعطيت DLL إلى شركة أخرى كل تنميتها في VB.يبدو أنهم يواجهون مشكلة ربط المهام.أنا لم تستخدم VB في عشر سنوات وأنا حتى لا يكون مثبتا.ماذا يمكن أن تكون المشكلة ؟

لقد أعلن جميع المهام العامة على النحو التالي:

#define MYDCC_API __declspec(dllexport)


MYDCCL_API unsigned long MYDCC_GetVer( void);
.
.
.

أي أفكار ؟


أخيرا عدت إلى هذا اليوم و يكون عليه العمل.الإجابات وضعني على الطريق الصحيح ولكن وجدت هذه مفيدة للغاية:

http://www.codeproject.com/KB/DLL/XDllPt2.aspx

أيضا, لقد كان عدد قليل من المشاكل التي يمر السلاسل إلى دالات DLL, لقد وجدت هذه مفيدة:

http://www.flipcode.com/archives/Interfacing_Visual_Basic_And_C.shtml


هل كانت مفيدة؟

المحلول

باستخدام __declspec للتصدير, اسم الدالة سوف تحصل على تصديرها المهترئ, أيتحتوي على نوع المعلومات للمساعدة في برنامج التحويل البرمجي C++ حل الزائدة.

VB6 لا يمكن التعامل مع المهترئ الأسماء.كحل مؤقت ، يجب أن دي فسد الأسماء.أسهل حل هو رابط ملف DLL باستخدام تصدير تعريف الملف في VC++.تصدير ملف تعريف بسيط جدا و يحتوي على اسم DLL و قائمة الدالات التي تم تصديرها:

LIBRARY mylibname
EXPORTS
    myfirstfunction
    secondfunction

بالإضافة إلى ذلك, يمكنك تحديد stdcall واصفا الاتفاقية لأن هذا هو فقط يدعو الاتفاقية VB6 يمكن التعامل معها.هناك مشروع باستخدام الجمعية حقن للتعامل مع ج المكالمات ولكن أعتقد أنك لا ترغب في استخدام هذا صعب و عرضة للخطأ الأسلوب.

نصائح أخرى

حاول إضافة __stdcall في النهاية

#define MYDCC_API __declspec(dllexport) __stdcall

لدينا بعض C++ dll التي تتفاعل مع VB6 تطبيقات لديهم كل ذلك في نهاية المطاف.

أ VB6 DLL دائما COM dll.أعطي وصف مثال في أقل عدد ممكن من الكلمات.افترض أن لديك DLL ActiveX المشروع في VB6 مع فئة تسمى CTest الذي يحتوي على الأسلوب كما هو مبين أدناه

الوظيفة العمومية vbConcat(ByVal a As String, ByVal b As String) As String vbConcat = a & b End Function

و يجب تعيين اسم المشروع كما VBTestLib في VB6 خصائص المشروع ، كنت قد جمعت المشروع F:\proj\VB6\ActiveXDLL\VBTestDLL.dll

تحتاج إلى تسجيل dll باستخدام الأوامر ويندوز regsvr32 F:\proj\VB6\ActiveXDLL\VBTestDLL.dll

الآن رمز C++:

#import "F:\proj\VB6\ActiveXDLL\VBTestDLL.dll" باستخدام مساحة VBTestLib;

الفراغ CDialogTestDlg::OnButton1() {

 HRESULT hresult;
 CLSID clsid;
 _CTest *t; // a pointer to the CTest object
 _bstr_t bstrA = L"hello";
 _bstr_t bstrB = L" world"; 
 _bstr_t bstrR;
 ::CoInitialize(NULL);
  hresult=CLSIDFromProgID(OLESTR("VBTestLib.CTest"), &clsid);
  hresult= CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,
                               __uuidof(_CTest),(LPVOID*) &t);
  if(hresult == S_OK)
  {
     bstrR  = t->vbConcat(bstrA , bstrB);
     AfxMessageBox((char*)bstrR);
   }

}

هذا كل ما في الأمر للحصول على بدء تشغيل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top