您在问题中写道,项目设置是 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
的大小是否至少为 12wchar_t
秒(包括终止的 NUL)?
然后,查看呼叫站点(您没有显示)。
你如何打印返回的字符串?也许您正在使用ANSI char 函数,因此返回的字符串被误解为char*
ANSI 字符串,因此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.
编辑
您在评论中澄清的事实是:
我将 DLL 切换为 ANSI,EXE 显然也是如此,尽管 exe 被记录为 Unicode。
让我觉得 EXE 采用UTF-8 Unicode 编码。
就像在 ANSI 字符串中一样, 0x00
UTF-8 中的一个字节是一个字符串 NUL 终止符,因此前面对 UTF-160x00
字节(在 a 中wchar_t
)被误解为字符串 NUL 终止符的分析适用。
请注意,纯 ASCII 是 UTF-8 的正确子集:因此,如果您只使用纯 ASCII 字符(如 in "Test"
)并将它们传递给 EXE,您的代码可能会工作。
但是,如果 EXE 被记录为使用 Unicode UTF-8,您可能需要做正确的事情并从 DLL 返回一个 UTF-8 字符串。
该字符串是通过char*
(对于 ANSI 字符串)返回的,但重要的是要确保UTF-8是 DLL 用于返回该字符串的编码,以避免将来出现细微的错误。
虽然 Windows API 和 Visual Studio 中使用的通用术语是"Unicode",但它实际上表示这些上下文中的UTF-16 Unicode 编码。
但是,UTF-16 并不是唯一可用的 Unicode 编码。例如,为了在 Internet 上交换文本,UTF-8编码被广泛使用。在您的情况下,听起来您的 EXE 需要一个 Unicode UTF-8 字符串。