2017-08-17 86 views
2

我在C++寫了一個DLL:AutoIt和C++。 Unicode的

extern "C" __declspec(dllexport) void Msg(std::wstring filename) 
{ 
    MessageBox(NULL, filename.c_str(), L"", MB_OK); 
} 

當我嘗試從AutoIt的調用的DLL:

DllCall("mydll.dll", "none:cdecl", "Msg", "wstr", @AutoItExe) 

我得到一個消息,用少量的象形文字。問題是什麼?

回答

3

當寫一個導出的DLL功能,則不應使用任何C++庫類型在其接口,因爲這些是編譯器,版本,和甚至溶液(DEBUG或NDEBUG)依賴性的。

如果你這樣做,你必須確保調用者使用這些類型的相同implemetation。這裏不是這種情況。

您應該限制DLL導出函數的接口,它與C類型兼容的,或其他類型時雙方同意只使用類型。

內,您的DLL實現,你可以做任何你想要的!

在這種情況下,您需要用LPCWSTR(又名const wchar_t*)替代std::wstring參數。這是AutoIt的的DllCall文檔中解釋說:

WSTR
一個Unicode寬字符串(最低65536個字符被分配)。

...

WINDOWS API類型:LPCWSTR/LPWSTR
的AutoIt類型:WSTR

而且從MSDN的Windows Data Types文檔:

LPWSTR
一個指向空終止的16位Unicode字符串。有關更多信息,請參閱字體使用的字符集。

此類型在WINNT.H聲明如下:

typedef WCHAR *LPWSTR; 

...

LPCWSTR
一個指針,指向16位Unicode字符的恆定空終止字符串。有關更多信息,請參閱字體使用的字符集。

此類型在WINNT.H聲明如下:

typedef CONST WCHAR *LPCWSTR;