2011-12-09 87 views
0

我有一個dll,有人讓我用C++。我需要在VB中使用這個DLL,爲了做到這一點,我必須在C++中創建另一個具有我可以在VB中調用的函數的DLL。在VB崩潰問題的C++ DLL

我所做的C++ dll有4個函數。 2個回調函數,用於從原始C++中檢索信息。以及我可以從VB調用來發送該信息的2個函數。

我知道原來的DLL工作正常,因爲我已經在控制檯應用程序中無休止地測試了它。

但是,當我用我的DLL和VB ..我得到隨機崩潰。

我的VB應用程序中幾乎沒有代碼用於測試。它只是輸出信息,所以沒有問題。

我相信問題出在我所做的C++ dll中。我用C++很新。
我想也許一個變量可以在兩個區域同時訪問(這是可能的嗎?)並導致它崩潰?

我的繼承人C的基本佈局+ DLL

//global variables 
CString allInfo=""; 
char* info=new char[25000]; 

//call back function 1 
HANDLE OnInfo(SendInfo* tempInfo) 
{ 
    CString stringTemp=""; 
    stringTemp=tempInfo->infomessage; 
    allInfo=allInfo+ stringTemp+"\n"; 
    return 0; 
} 

//function for vb 
BSTR _stdcall vbInfo() 
{ 
    allInfo=allInfo.Right(20000); //get last 20,000 characters 
    strcpy_s(info,20000,allInfo); 
    BSTR Message; 
    Message = SysAllocStringByteLen (info, lstrlen(info)); 
    return Message; 
} 

崩潰似乎完全隨機發生。

有什麼建議嗎?

感謝

+0

發佈這些函數的vb.net聲明。 –

回答

0

除了得知谷歌搜索CString類參考返回一些啊哈有趣的結果,你的問題可能會是CString的的多址接入。

您沒有發佈很多信息,所以我將假設OnInfo方法是一個回調函數,該函數由與執行vbInfo不同的執行線程調用。在這種情況下,你想看看CString::operator=()方法描述在MSDN上:

CString的賦值(=)運算符將重新初始化與新數據的現有的CString 對象。如果目標字符串(即左邊的 )已經足夠大以存儲新數據,則不會執行新的內存分配。您應該知道,使用賦值運算符時可能會發生內存異常 ,因爲新的存儲空間 通常被分配用於保存生成的CString對象。

鑑於似乎沒有要在什麼你把CString的大小有限制,可以重新分配,並在一個功能分配在allInfo內存,而你正在閱讀或書面它另一個功能。當你突然嘗試寫入未分配的內存時,事情並不會那麼順利。

你可能想看看像Critical Section or a mutex這樣的東西來保持你的兩個函數不佔用公共內存緩衝區。

0

你沒有說如果你的DLL編譯爲使用Unicode或ANSI字符串。你沒有說如果其他人提供給你的dll被編譯爲使用Unicode或ANSI字符串。VB調用者可能會給你Unicode字符串,但是可以讓VB調用者給你ANSI字符串。所以我們看到你的代碼有未知類型的CString,char *指向一個ANSI字符串,BSTR指向一個Unicode字符串,但大小以字節爲單位分配,誰知道是什麼。

有很多文章解釋如何使用Unicode,但對於C++相當陌生的人來說,它們有點太重了。

如果你回到爲你製作其他dll的人,並要求該人添加你需要的功能,這將是最好的。還提到他們,你會從VB調用DLL,所以你需要他們的DLL來處理Unicode字符串。