2008-09-02 163 views
2

我有一個Windows DLL,我用C/C++編寫(所有導出的函數都是'C')。在VC++中,DLL對我很好。我已經將DLL交給了另一家在VB中完成所有開發的公司。他們似乎有鏈接到功能的問題。我在十年內沒有使用過VB,甚至沒有安裝它。可能是什麼問題呢?從VB6調用DLL函數

我宣佈我所有的公共職能如下:

#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


回答

4

通過使用__declspec用於出口,函數名稱將得到出口錯位,即包含類型信息,以幫助C++編譯r解決重載問題。

VB6無法處理損壞的名稱。作爲一種解決方法,您必須對名稱進行解壓。最簡單的解決方案是使用VC++中的export definition文件鏈接DLL文件。導出定義文件非常簡單,只包含DLL的名稱和導出的函數列表:

LIBRARY mylibname 
EXPORTS 
    myfirstfunction 
    secondfunction 

此外,您必須指定stdcall調用約定,因爲這是唯一調用約定VB6可以處理。有一個項目使用組裝注入來處理C調用,但我想你不想使用這種困難且容易出錯的方法。

3

嘗試結束

#define MYDCC_API __declspec(dllexport) __stdcall 

我們有一些C++的DLL與我們的老VB6的應用程序進行交互,他們都有,在結尾處添加__stdcall。

0

VB6 DLL總是一個COM DLL。我將盡可能少地描述一個例子。假設在與被叫CTEST類VB6一個ActiveX DLL項目包含如下所示

公共功能vbConcat(BYVAL一個作爲字符串,BYVAL b以字符串)作爲字符串的方法 vbConcat =一個& b 端功能

,並已在VB6項目屬性中設置的項目名稱爲VBTestLib和 你編譯項目爲F:\凸出\ VB6 \ ActiveXDLL \ VBTestDLL.dll

您需要註冊使用Windows的dll命令 regsvr32 F:\ proj \ VB6 \ ActiveXDLL \ VBTestDLL。dll的

現在你的C++代碼:

#進口 「F:\凸出\ 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); 
    } 

}

這一切就是這麼簡單,上手了。

+1

你有這個倒退。問題是從C++導出並導入到VB6。 – 2013-05-07 17:18:48