2017-08-17 3 views
2

私はC++でDLL書きました:私はのAutoItからDLLを呼び出すしようとするとAutoItとC++。 Unicodeの

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

を:

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

私は象形文字の数が少ないメッセージが表示されます。何が問題ですか?

答えて

3

エクスポートされたDLL関数を書くときには、コンパイラ、バージョン、さらにはソリューション(DEBUGまたはNDEBUG)に依存するため、インターフェイスにC++ライブラリタイプを使用すべきではない(SHOULD)。

これを行う場合は、発信者がこれらのタイプと同じ実装を使用していることを確認する必要があります。ここではそうではありません。

DLLのエクスポート関数を制限して、C言語の型または相互に合意された他の型と互換性のある型だけを使用するようにしてください。

DLL実装では、必要な操作を行うことができます。

この場合、std::wstringパラメータをLPCWSTR(別名const wchar_t*)に変更する必要があります。これはAutoItののDllCallドキュメントで説明されています。
UNICODEワイド文字列(65536文字の最小値が割り当てられている)

WSTR。

...

Windows APIのタイプ:LPCWSTR/LPWSTR
AutoItの種類:WSTR

そしてMSDNのWindows Data Typesドキュメントから:

LPWSTR
ヌルへのポインタ16ビットのUnicode文字の末尾の文字列。詳細については、「フォントで使用される文字セット」を参照してください。

次のようにこのタイプはWINNT.Hに宣言されています。

typedef WCHAR *LPWSTR; 
...

LPCWSTR
16ビットUnicode文字の定数NULLで終わる文字列へのポインタ。詳細については、「フォントで使用される文字セット」を参照してください。次のように

このタイプはWINNT.Hに宣言されています。

typedef CONST WCHAR *LPCWSTR;