LPTSTR 只包含一个字母
LPTSTR contains only one letter
我正在为应用程序创建 DLL。应用程序调用 DLL 并接收长度为 8 到 50 的字符串。
我遇到的问题是 仅显示应用程序收到的任何消息的第一个字母。
下面是 GetMethodVersion 函数。
#include "stdafx.h"
STDAPI_(void) GetMethodVersion(LPTSTR out_strMethodVersion, int in_intSize)
{
if ((int)staticMethodVersion.length() > in_intSize)
return;
_tcscpy_s(out_strMethodVersion, 12, _T("Test"));
//staticMethodVersion should be insted of _T("Test")
}
项目设置设为 Unicode。
经过一些研究,我相信 Unicode 格式及其功能存在问题。感谢您提供的任何帮助。
在#include "stdafx.h"
之后到#define UNICODE
就晚了。它应该在 stdafx.h
本身的第一个 #include
之前定义。但正确的方法是在项目属性中设置它(菜单项目>属性>配置属性>常规>字符集> "Use Unicode Character Set")。
您在问题中写道,项目设置是 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");
}
你确定 "magic number" 12 是正确的吗? out_strMethodVersion
指向的目标字符串缓冲区的大小是否至少为 12 wchar_t
s(包括终止 NUL)?
然后,查看调用站点(您尚未显示)。
如何打印 returned 字符串?也许您使用的是 ANSI 字符函数,因此 returned 字符串被 错误解释 作为 char*
ANSI 字符串,因此 Unicode UTF-16 字符串的第一个 0x00
字节在调用站点被错误解释为 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.
编辑
您在评论中澄清的事实:
I switched the DLL to ANSI, the EXE apparently was that as well, though the exe was documented as Unicode.
让我觉得 EXE 假定 UTF-8 Unicode 编码。
正如在ANSI字符串中,UTF-8中的一个0x00
字节是一个字符串NUL终止符,所以前面分析UTF-16的0x00
字节(在wchar_t
) 误解 为字符串 NUL 终止符适用。
请注意,纯 ASCII 是 UTF-8 的真子集:因此如果您只使用纯 ASCII 字符(如 "Test"
)并将它们传递给 EXE,您的代码可能会工作。
但是,如果 EXE 被记录为使用 Unicode UTF-8,您可能需要做正确的事并 return 来自 DLL 的 UTF-8 字符串。
字符串是通过 char*
编辑的 return(对于 ANSI 字符串),但确保 UTF-8 是DLL 对 return 该字符串使用的编码,以避免将来出现细微错误。
虽然 Windows API 和 Visual Studio 中使用的一般术语是 "Unicode",但它实际上意味着 UTF -16 那些上下文中的 Unicode 编码。
但是,UTF-16 并不是唯一可用的 Unicode 编码。例如,为了在 Internet 上交换文本,UTF-8 编码被广泛使用。在您的情况下,听起来您的 EXE 需要一个 Unicode UTF-8 字符串。
我正在为应用程序创建 DLL。应用程序调用 DLL 并接收长度为 8 到 50 的字符串。
我遇到的问题是 仅显示应用程序收到的任何消息的第一个字母。
下面是 GetMethodVersion 函数。
#include "stdafx.h"
STDAPI_(void) GetMethodVersion(LPTSTR out_strMethodVersion, int in_intSize)
{
if ((int)staticMethodVersion.length() > in_intSize)
return;
_tcscpy_s(out_strMethodVersion, 12, _T("Test"));
//staticMethodVersion should be insted of _T("Test")
}
项目设置设为 Unicode。 经过一些研究,我相信 Unicode 格式及其功能存在问题。感谢您提供的任何帮助。
在#include "stdafx.h"
之后到#define UNICODE
就晚了。它应该在 stdafx.h
本身的第一个 #include
之前定义。但正确的方法是在项目属性中设置它(菜单项目>属性>配置属性>常规>字符集> "Use Unicode Character Set")。
您在问题中写道,项目设置是 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");
}
你确定 "magic number" 12 是正确的吗? out_strMethodVersion
指向的目标字符串缓冲区的大小是否至少为 12 wchar_t
s(包括终止 NUL)?
然后,查看调用站点(您尚未显示)。
如何打印 returned 字符串?也许您使用的是 ANSI 字符函数,因此 returned 字符串被 错误解释 作为 char*
ANSI 字符串,因此 Unicode UTF-16 字符串的第一个 0x00
字节在调用站点被错误解释为 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.
编辑
您在评论中澄清的事实:
I switched the DLL to ANSI, the EXE apparently was that as well, though the exe was documented as Unicode.
让我觉得 EXE 假定 UTF-8 Unicode 编码。
正如在ANSI字符串中,UTF-8中的一个0x00
字节是一个字符串NUL终止符,所以前面分析UTF-16的0x00
字节(在wchar_t
) 误解 为字符串 NUL 终止符适用。
请注意,纯 ASCII 是 UTF-8 的真子集:因此如果您只使用纯 ASCII 字符(如 "Test"
)并将它们传递给 EXE,您的代码可能会工作。
但是,如果 EXE 被记录为使用 Unicode UTF-8,您可能需要做正确的事并 return 来自 DLL 的 UTF-8 字符串。
字符串是通过 char*
编辑的 return(对于 ANSI 字符串),但确保 UTF-8 是DLL 对 return 该字符串使用的编码,以避免将来出现细微错误。
虽然 Windows API 和 Visual Studio 中使用的一般术语是 "Unicode",但它实际上意味着 UTF -16 那些上下文中的 Unicode 编码。
但是,UTF-16 并不是唯一可用的 Unicode 编码。例如,为了在 Internet 上交换文本,UTF-8 编码被广泛使用。在您的情况下,听起来您的 EXE 需要一个 Unicode UTF-8 字符串。