1

我正在为应用程序创建一个 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 格式及其功能存在问题。谢谢你提供的所有帮助。

4

2 回答 2

2

您在问题中写道,项目设置是 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 字符串,因此0x00Unicode 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 字符串中一样, 0x00UTF-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 字符串。

于 2016-02-23T12:20:42.197 回答
0

为时已晚#define UNICODE#include "stdafx.h"它应该在第一个本身之前#include定义stdafx.h。但正确的方法是在项目属性中设置它(菜单项目>属性>配置属性>常规>字符集>“使用Unicode字符集”)。

于 2016-02-23T11:59:01.267 回答