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_ts(包括终止 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 字符串。