2017-08-17 1 views
2
Unicode

Ich schrieb eine DLL in C++:AutoIt und C++.

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

Wenn ich versuche, die DLL aus AutoIt zu nennen:

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

Ich erhalte eine Meldung mit einer kleinen Anzahl von Hieroglyphen. Was ist das Problem?

Antwort

3

Wenn Sie eine exportierte DLL-Funktion schreiben, SOLLTEN Sie KEINE C++ - Bibliothekstypen in ihrer Schnittstelle verwenden, da diese vom Compiler, der Version und sogar von der Lösung (DEBUG oder NDEBUG) abhängig sind.

Wenn Sie dies tun, müssen Sie sicherstellen, dass der Aufrufer die gleiche Implementierung dieser Typen verwendet. Was ist hier nicht der Fall.

Sie sollten DLL exportierte Funktionen einschränken, um nur Typen in ihrer Schnittstelle zu verwenden, die mit C-Typen oder anderen gegenseitig vereinbarten Typen kompatibel sind.

Innerhalb Ihrer DLL-Implementierung können Sie tun, was Sie wollen! In diesem Fall müssen Sie stattdessen den Parameter std::wstring durch LPCWSTR (aka const wchar_t*) ersetzen. Dies ist in AutoIt der DllCall Dokumentation erläutert:

WSTR
eine UNICODE breite Zeichenfolge (ein Minimum von 65.536 Zeichen zugeordnet).

...

WINDOWS-API-Typ: LPCWSTR/LPWSTR
AutoIt Typ: WSTR

Und von Windows Data Types Dokumentation MSDN:

LPWSTR
Ein Zeiger auf eine Null -terminierte Zeichenfolge von 16-Bit-Unicode-Zeichen. Weitere Informationen finden Sie unter Von Schriftarten verwendete Zeichensätze.

Dieser Typ wird in WinNT.h erklärt sich wie folgt:

typedef WCHAR *LPWSTR; 

...

LPCWSTR
Ein Zeiger auf einen konstanten Null-terminierte Kette von 16-Bit-Unicode-Zeichen. Weitere Informationen finden Sie unter Von Schriftarten verwendete Zeichensätze.

Dieser Typ in WinNT.h wie folgt deklariert:

typedef CONST WCHAR *LPCWSTR;