C++ AutoIt和C++;。统一码

C++ AutoIt和C++;。统一码,c++,visual-c++,unicode,dllimport,autoit,C++,Visual C++,Unicode,Dllimport,Autoit,我用C++编写了一个DLL: 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) 我收到一条带有少量象形文字的信息。问题是什么?< p>当

我用C++编写了一个DLL:

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)

我收到一条带有少量象形文字的信息。问题是什么?

< p>当你写导出的DLL函数时,你不应该在它的接口中使用任何C++库类型,因为这些是编译器、版本甚至解决方案(调试或NDEUG)依赖。 如果这样做,则必须确保调用方使用这些类型的相同实现。但事实并非如此

您应该限制DLL导出函数仅使用其接口中与C类型兼容的类型,或其他双方同意的类型

在DLL实现中,您可以做任何您想做的事情

在这种情况下,您需要将
std::wstring
参数替换为
LPCWSTR
(也称为
const wchar\u t*
)。AutoIt的文档中对此进行了解释:

WSTR
UNICODE宽度的字符串(分配的字符数至少为65536个)

WINDOWS API类型:LPCWSTR/LPWSTR
自动IT类型:WSTR

从MSDN的文档中:

LPWSTR
指向以空结尾的16位Unicode字符字符串的指针。有关详细信息,请参见字体使用的字符集

该类型在WinNT.h中声明如下:

typedef WCHAR *LPWSTR;
typedef CONST WCHAR *LPCWSTR;

LPCWSTR
指向由16位Unicode字符组成的以null结尾的常量字符串的指针。有关详细信息,请参见字体使用的字符集

该类型在WinNT.h中声明如下:

typedef WCHAR *LPWSTR;
typedef CONST WCHAR *LPCWSTR;