В вашем вопросе вы указали, что параметры проекта Unicode: это верно для и DLL и вызывающий EXE? Убедитесь, что они оба совпадают.
В Unicode строит, уродливые макросы TCHAR стали:
LPTSTR --> wchar_t*
_tcscpy_s --> wcscpy_s
_T("Test") --> L"Test"
Так у вас есть:
STDAPI_(void) GetMethodVersion(wchar_t* out_strMethodVersion,
int in_intSize)
{
...
wcscpy_s(out_strMethodVersion, 12, L"Test");
}
Вы уверены, что "магическое число" 12 правильно? Является ли буфер строки назначения указанным out_strMethodVersion
размером не менее 12 wchar_t
s (включая завершающий NUL)?
Затем ознакомьтесь с сайтом для звонков (который вы не указали).
Как вы печатаете возвращаемую строку? Может быть, вы используете ANSI функции обугленного, поэтому возвращаемая строка неверно истолкованы как ANSI строку char*
, и поэтому первый 0x00
байт Unicode UTF-16 строка ошибочно интерпретируется как NUL-терминатор на месте вызова, и строка печатается при первом символе при печати?
Text: T e s t NUL
UTF-16 bytes: 54 00 65 00 73 00 74 00 00 00
(hex) **<--+
|
First 00 byte misinterpreted as
NUL terminator in char* ANSI string,
so only 'T' (the first character) gets printed.
EDIT
Тот факт, что вы разъяснены в комментариях, что:
Я переключил DLL в ANSI, то EXE-видимому, в том, что, как хорошо, хотя exe был задокументирован как Unicode.
заставляет меня думать, что EXE предполагает кодировку Unicode UTF-8.
Подобно тому, как в строках ANSI, A 0x00
байт UTF-8 является строка NUL-терминатор, так что предыдущий анализ UTF-16 0x00
байт (в wchar_t
) неверно истолкован, как применяется строка NUL-терминатор.
Обратите внимание, что чистый ASCII является подходящим подмножеством UTF-8: поэтому ваш код может работать, если вы просто используете чистые символы ASCII (например, в "Test"
) и передаете их в EXE.
Однако, если EXE задокументирован использованием Unicode UTF-8, вы можете захотеть сделать правильную вещь и вернуть строку UTF-8 из DLL.
Строка возвращается через char*
(как для строк ANSI), но важно, что вы убедитесь, что UTF-8 это кодировка используется DLL, чтобы вернуть эту строку, чтобы избежать тонких ошибок в будущем.
Хотя общая терминология, используемая в ОС Windows API, и в Visual Studio является "Unicode", это на самом деле означает UTF-16 кодировки Unicode в этих контекстах.
Однако UTF-16 не является единственной кодировкой Unicode. Например, для обмена текстом в Интернете широко используется кодировка UTF-8. В вашем случае это похоже на то, что ваш EXE ожидает строку Unicode UTF-8.
Почему существуют три строки кода: 'out_strMethodVersion',' staticMethodVersion', 'out_String'? – Dialecticus
Извините, удалили кучу ненужного кода и, должно быть, пропустили переименование – PonWer
Где вы видите одну букву в одной из окон отладки Visual Studio или в консоли или графическом интерфейсе вашего приложения? Может быть, строка Unicode, но Visual Studio думает, что это не так? Посмотрите на строку непосредственно в памяти и посмотрите, есть ли другие буквы, разделенные 00 байтами. – Dialecticus