2017-08-17 72 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;