c++ - LPTSTR 只包含一个字母

标签 c++ dll unicode lptstr lpwstr

我正在为应用程序创建 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 格式及其功能存在问题。感谢您提供的任何帮助。

最佳答案

您在问题中写道,项目设置是 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(包括终止 NUL)?

然后,查看调用站点(您尚未显示)。

如何打印返回的字符串?也许您正在使用 ANSI char 函数,因此返回的字符串被误解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,您可能想要做正确的事并从 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 字符串。

关于c++ - LPTSTR 只包含一个字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35576973/

相关文章:

c++ - 使用字符串变量而不是字符串文字会导致错误

c++ - 如果已经设置,则在 CMake 中更改标志值

visual-studio - 在 Visual Studio 中复制 DLL 的依赖项

c# - 有没有一种方法可以让我在实际执行之前安全地检查是否可以加载程序集?

ruby-on-rails - "msvcrt-ruby18.dll was not found"与 ruby

javascript - Parsley.js 除了英文字母之外还验证僧伽罗语泰米尔语(非英语字符)

c++ - 如何编写指向函数的函数指针,返回指向函数的函数指针?

c++ - 如何管理需要从递归仿函数/lambda 派生的模板参数的声明?

python - 在 Python 中转储到 JSON 时,字符串中的 Unicode 值被转义

python - (Python) PyInstaller unicode 错误