- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为应用程序创建 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/
这个问题已经有答案了: How do I concatenate const/literal strings in C? (17 个回答) 已关闭 7 年前。 我想向 LPTSTR 添加一个字符串。
我正在为应用程序创建 DLL。应用程序调用 DLL 并接收长度为 8 到 50 的字符串。 我遇到的问题是仅显示应用程序收到的任何消息的第一个字母。 下面是 GetMethodVersion 函数。
我需要创建一个变量以在 CreateProcess 中使用: CreateProcess(z7Cmdline, z7Arg, NULL, NULL, FALSE, NULL, NULL, NULL,
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我试图理解为什么在执行这段代码期间会发生段错误(SIGSEGV)。该错误在测试 while 指令中指定的条件时发生,但不是在第一次迭代时发生,而是在第二次迭代时发生。 LPTSTR arrayStr[
我正在使用此代码获取 Windows 版本: #define BUFSIZE 256 bool config::GetOS(LPTSTR OSv) { OSVERSIONINFOEX osve;
我正在尝试复制 LPTSTR 并将该字符串作为成员变量存储在对象中。但是我复制 LPTSTR 的尝试似乎失败了,当我去访问/打印复制的 LPTSTR 的值时,我遇到了程序崩溃。 是否可以复制 LPTS
我需要一个提供 LPTSTR 和枚举值的函数,根据该值构造一个字符串并将其放入 LPTSTR。 我编写了以下函数,它使用由枚举值索引的名称数组: bool GetWinClassName(const
我一直在使用一个从过滤器驱动程序接收消息的应用程序。驱动程序运行良好,但我的内存管理有问题,可能是 LPTSTRs user & domain。 在调试时,我收到有关堆损坏的消息,它们通常指向两个 f
有人能说我用对了吗? LPTSTR nameProc = ""; ... GetProcessImageFileName( hProcess, nameProc, 50 ); printf("name
我正在 Visual Studio 2013 上编写 C++ dll。我的 dll 应该从 ini 文件中读取参数。因此,我为此创建了一个函数 (ReadConnectionSettings())。我
这个问题在这里已经有了答案: Convert lptstr to char* (8 个答案) Convert LPTSTR to string or char * to be written to
有没有等价于 LPTSTR 的字符串?我知道字符串和 wstring。有 tstring 吗? 最佳答案 你可以定义一个: typedef std::basic_string mystring; ..
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Convert lptstr to char* 我需要将 LPTSTR p 转换为 CHAR ch[]。我是
嗨,谁能帮我将 LPTSTR 转换为 QString 最佳答案 您将在 the docs 中看到Qstring 提供了静态函数来转换 ascii 和 Unicode 字符串: QString from
我需要将 LPTSTR 转换为 LPCWSTR。我需要这个,因为我从 GetDlgItemText 获取 LPTSTR,我将把它提供给 ExtTextOut,它接受 LPCWSTR. 编辑:在从 Ge
我有以下代码来枚举给定 .exe 中的所有资源文件 BOOL CALLBACK EnumResNameProc(HMODULE hModule, LPCTSTR lpszType, LPTSTR lp
我需要将注册表中的值存储在 map 中。我有这样的代码: map mymap; for (i = 0, retCode = ERROR_SUCCESS; i(i, val));
函数参数为LPCTSTR&。 我必须将 LPTSTR 变量作为 LPCTSTR& 传递。 如何将LPTSTR转换为LPCTSTR&。 提前致谢。 最佳答案 根据我以前的 C++ 经验,您正试图通过引用
因此函数 GetUserName() 的输出将用户名作为 LPTSTR。我需要将其转换为 LPCSTR,因为我希望用户名成为 ftp 目录的名称。 TCHAR id [UNLEN+1]; DWORD
我是一名优秀的程序员,十分优秀!