Я написал DLL на C ++:
extern "C" __declspec(dllexport) void Msg(std::wstring filename)
{
MessageBox(NULL, filename.c_str(), L"", MB_OK);
}
Когда я пытаюсь вызвать DLL из AutoIt:
DllCall("mydll.dll", "none:cdecl", "Msg", "wstr", @AutoItExe)
Я получаю сообщение с небольшим количеством иероглифов. В чем проблема?
Когда вы пишете экспортированную функцию DLL, вы НЕ ДОЛЖНЫ использовать какие-либо типы библиотек C ++ в ее интерфейсе, поскольку они зависят от компилятора, версии и даже решения (DEBUG или NDEBUG).
Если вы это сделаете, вы должны убедиться, что вызывающая сторона использует ту же реализацию этих типов. Что здесь не так.
Вы должны ограничить экспортируемые функции DLL, чтобы использовать в их интерфейсе только те типы, которые совместимы с типами C или другими взаимно согласованными типами.
Внутри вашей реализации DLL вы можете делать все, что захотите!
В этом случае вам необходимо заменить std::wstring
параметр с LPCWSTR
(ака const wchar_t*
) вместо Это объясняется в AutoIt’s DllCall
документация:
WSTR
строка широких символов UNICODE (выделяется минимум 65536 символов).…
Тип WINDOWS API: LPCWSTR / LPWSTR
Тип AutoIt: WSTR
И из MSDN Типы данных Windows документация:
LPWSTR
Указатель на завершающуюся нулем строку из 16-битных символов Юникода. Для получения дополнительной информации см. Наборы символов, используемые шрифтами.Этот тип объявлен в WinNT.h следующим образом:
typedef WCHAR *LPWSTR;
…
LPCWSTR
Указатель на постоянную строку с нулевым символом в конце, состоящую из 16-битных символов Юникода. Для получения дополнительной информации см. Наборы символов, используемые шрифтами.Этот тип объявлен в WinNT.h следующим образом:
typedef CONST WCHAR *LPCWSTR;
Других решений пока нет …