سؤال
لدي ويندوز 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);
}
}
هذا كل ما في الأمر للحصول على بدء تشغيل.