我有一個需要在C++中處理的DLL。我正在使用WxWidgets(標準編譯,但我也嘗試過Unicode開/關)和NetBeans。我也試過在沒有WxWidgets的情況下處理這個問題(windows.h
),並且遇到了同樣的問題。在C++中使用緩衝區時的垃圾回收字符
這裏是我如何訪問使用wxWidgets的DLL功能:
// -------------------- POINTERS TO FUNCTIONS
typedef bool(*TYPE_DLL_SetLicense)(char*, char*);
typedef bool(*TYPE_DLL_PingConnection)(char*);
typedef char*(*TYPE_DLL_ERR_DESCRIPTION)(void);
class DLL_Library
{
public:
// pointers to functions inside dll
TYPE_DLL_SetLicense DLL_SetLicense; //initialize - will wor fine as it returns only true/false (buffer only provide data)
TYPE_DLL_PingConnection DLL_PingConnection; //ping to serwer. Will return trahs, becouse it uses buffer to provide data ang get answear back
TYPE_DLL_ERR_DESCRIPTION DLL_ERR_DESCRIPTION; //error description. No buffer, no trouble. Returns correct string.
wxDynamicLibrary dynLib2;
int initialize(void)
{
//patch to dll
wxString path = wxStandardPaths::Get().GetExecutablePath().BeforeLast('\\') + _("\\DLL_dll\\DLLMOK.dll");
if(!wxFile::Exists(path)) return -1;
//load dll
if(!dynLib2.Load(path)) return -2;
//Assign functions in dll to variable
DLL_SetLicense=(TYPE_DLL_SetLicense) dynLib2.GetSymbol(wxT("DLL_SetLicense"));
DLL_PingConnection=(TYPE_DLL_PingConnection) dynLib2.GetSymbol(wxT("DLL_PingConnection"));
DLL_ERR_DESCRIPTION=(TYPE_DLL_ERR_DESCRIPTION) dynLib2.GetSymbol(wxT("DLL_ERROR_DESCRIPTION"));
return 0;
}
};
這裏是我運行的功能。它應該返回和XML內容,我試圖保存到文件。
//DLL_PingConnection
//result ping to be save in file
wxFile file_ping_xml;
plik_ping_xml.Open(wxT("C:\\dll\\ping.xml"),wxFile::write);
char buffor_ping_xml[2000];
//I run the function here
bool is_ping = DLL_PingConnection(buffor_ping_xml);
if(is_ping)
{
tex_box->AppendText(wxT("DLL_PingConnection True\n"));
//we save result to file
bool is_write_ping_ok = file_ping_xml.Write(buffor_ping_xml,2000);
if (is_write_ping_ok){tex_box->AppendText(wxT("Save to file is ok ok\n"));}
else {tex_box->AppendText(wxT("Save to file failed :(\n"));}
}
else
{
tex_box->AppendText(wxT("DLL_PingConnection False\n"));
}
std::cout << "Error description: " << DLL_ERR_DESCRIPTION() << "\n"; //will work fine both in saving to file, and in streaming to screen.
的問題是,該文件,而不是良好的內容裏面我得到垃圾這樣的:
請注意,這只是發生在使用緩衝區像功能:
char buffer[2000] //buffer will contain for example file xml
function do_sth_with_xml(buffer) //buffer containing xml will (should) be overwriten with xml results of the function - in our case DLL_PingCONNECTION should save in buffer xml with connection data
文檔說該DLL在Windows-1250上運行。文件ping.xml
我已經設置爲Windows ANSI,但我不認爲問題在於此。
編輯:我寫了沒有WxWidgets的問題(我加載DLL使用windows.h
) - 同樣的問題。這是代碼:Getting trash data in char* while using it as buffer in function。請幫助:(
嗨。函數名稱是一個錯字(現在已修復) - 我將某些東西的代碼分條以使其閱讀更加容易。然而,關於變量'buffor_ping_xml [2000]',如果我這樣給bufor,這是唯一的方法:'char * buffor_ping_xml'程序將會崩潰。在文檔中我使用了一個數據類型'PChar'。有任何想法嗎? –
另外:從typdef中取走*將不會編譯。 –
@baron_bartek:你試過了:'const char * buffor_ping_xml = new char [2000];' –