- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
有人可以在这里解释并帮助我吗?可以说我有这样的功能,其中 lpData 包含指向我想要的数据的指针。
void foo(LPVOID lpData) {
}
检索此内容的正确方法是什么。这行得通,但最后我得到了奇怪的字符
void foo(LPVOID lpData) {
LPVOID *lpDataP = (LPVOID *)lpData;
char *charData = (char*)lpDataP;
//i log charData....
}
我更喜欢使用字符串,但我不明白如何检索数据,当我尝试使用字符串时,我只是得到空指针错误。 lpData 持有一个指针吧? (但我的函数是 lpData 而不是 *lpData)所以它不起作用?我做错了吗?
string *datastring = reinterpret_cast<std::string *>(lpData);
我正在尝试。
最佳答案
This works but i get weird characters at the end
这意味着您的字符串不是以 null 结尾的——也就是说,它没有 NUL
标记字符串结尾的字节 ( 0
)。
C 字符串必须是 null-terminated .* 当您记录 C 字符串 ( char *
) 时,它会一直记录字符,直到找到 NUL
。 .如果字符串末尾没有,它将继续遍历随机内存,直到找到一个(或者直到遇到页面错误并崩溃)。这不好。而且没有办法修复它;一旦失去长度,就无法恢复。
但是,未终止的字符串及其长度可能很有用。许多函数可以与 char *
一起使用长度,作为额外参数(例如,string
构造函数)或其他方式(例如,printf
格式字符串中的宽度说明符)。
因此,如果您采用长度,并且只调用也采用该长度的函数——或者只是制作一个以 null 结尾的拷贝并使用它——你没问题。所以:
void foo(LPVOID lpData, int cchData) {
string sData(static_cast<const char *>(lpData), cchData);
// now do stuff with sData
}
与此同时,从 LPVOID
转换(又名 void *
,又名指向任何东西的指针)到 LPVOID *
(又名 void **
,又名指向任何指针的指针)然后转换为 char *
(pointer-to-characters) 是错误的(并且应该在第二次转换中给你一个编译器警告;如果你收到警告并忽略它们,请不要那样做!)。此外,使用现代类型转换而不是 C 风格类型转换通常更好,而且在没有缺点的情况下,const-correct 总是更好;它只是让事情对读者来说更明确,并且在面对 future 的维护时更安全。
最后:
string *datastring = reinterpret_cast<std::string *>(lpData);
这几乎肯定是错误的。** LPVOID
只是指着一堆字符。你是说你想将这些字符解释为 string
目的。但是一个string
object 是一些头信息(可能是长度和容量等)加上指向一堆字符的指针。把一个当作另一个会导致垃圾或崩溃。***
* 是的,您使用的是 C++,而不是 C,而是 char *
是“C 字符串”。
** 如果你真的有一个 string
您在某处保持事件状态的对象,并将指向该对象的指针隐藏在 LPVOID
中现在已经检索到它(例如,使用 SetWindowLongPtr
/GetWindowLongPtr
),然后从 LPVOID
进行转换至 string *
会有意义。但我怀疑那是你在做什么。 (如果你是,那么你不需要 reinterpret_cast
。void *
的全部意义在于它没有被解释,所以没有什么可以重新解释的。只需使用 static_cast
。)
*** 或者,最糟糕的是,它可能看起来有效,但随后会导致难以跟踪的崩溃或损坏。一些标准 C++ 库使用特殊的分配器将标题放在字符之前,并返回指向第一个字符的指针,因此 string
可以在任何地方使用char *
能。 string
里面类,每个方法都必须捏造 this
向后指针;例如,不只是说 m_length
它必须做类似 static_cast<_string_header *>(this)[-1]->m_length
的事情.但反过来是行不通的——如果你只有一堆字符,而不是 string
对象,该软糖将读取恰好在字符之前分配的任何字节,并尝试将它们解释为整数,因此您最终可能会认为您有一个长度为 0 或 182423742341241243 的字符串。
关于c++ - 从 LPVOID 中检索字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24399603/
我正在处理处理 USB 设备的函数。 但我已经在一些简单的事情上遇到了问题: 我遇到了编译错误 A value of the type "LPVOID" can not be assigned to
我有以下代码: IShellLink* psl; HRESULT hres = CoCreateInstance( CLSID_ShellLink, NULL, CLSCTX_
我确实在论坛和 MSDN 上看了一会儿,但似乎无法找到我的问题所在。我相信这对于像我这样的非菜鸟来说很简单。我正在尝试编译一个简单的程序,它不喜欢我的代码。 #include "pch.h" #inc
我有一个采用 LPVOID 类型参数的 C 函数。传入的值是\0 分隔的字符数组。如何转换参数以查看 Visual Studio/windbg 中的传入值? 最佳答案 您可以在脚本中执行此操作。像下面
我正在编写一个简单的控制台应用程序,它允许我从通过我提供的参数传递的一组参数创建多个线程。 DWORD WINAPI ThreadFunc(LPVOID threadData) { } 我将它们打包到
在我将其投入类之前,它运行良好。对解决此类型转换错误有任何帮助吗? 错误 error C2440: 'type cast' : cannot convert from 'IAT CInjector::
我在使用文件映射和阅读时遇到问题。 在下面的代码中,我从 MapViewOfFile 中获取了 pMemory,但我不知道如何将内容显示到 Edit 控件,我只得到乱七八糟的字符(如汉字)。我想使用
我正在尝试创建一个线程来处理 ZIP 归档: HANDLE hThread = CreateThread( NULL, 0, ZipProcess,
不是很教授。用C++。我一直在研究的代码是:https://msdn.microsoft.com/en-us/library/windows/desktop/ee175819(v=vs.85).asp
我正在尝试将数据从传递到我的方法的参数转换为结构,我需要将数据传递到全局变量,因为它在我的应用程序的其他地方需要。 我已经尝试了以下但我收到错误提示 diceResult is an undeclar
我想读取我通过 CreateRemoteThread 发送到我在另一个进程中注入(inject)的 DLL 的参数。 我可以毫无问题地调用该函数,我只是不知道如何将 LPVOID 转换为结构。 这是一
有人可以在这里解释并帮助我吗?可以说我有这样的功能,其中 lpData 包含指向我想要的数据的指针。 void foo(LPVOID lpData) { } 检索此内容的正确方法是什么。这行得通,但最
我是 C 编程语言的初学者,我得到了以下代码: LPVOID lpvAddr; lpvAddr = VirtualAlloc(NULL, strlen(jmp_esp), 0x3000, 0x40);
我有以下 Win32 ATL 代码: CComVariant result; DWORD dwFileSize = GetFileSize(hFile, NULL); LPVOID lpBuffer
如何将 WIN32_FIND_DATA 转换为 LPVOID? 我正在尝试 Hook 一个函数,但我无法将 WIN32_FIND_DATA 转换为 LPVOID 这是我的功能: /* New Find
这个问题在这里已经有了答案: How to find the size of an array (from a pointer pointing to the first element array
好的,我正在尝试在 WFSExecute 下编写此代码,但如果我键入: WFSPINGETDATA * pingetdata = lpCmdData; 我得到一个错误: errorC2440: 'in
在 C++ 中进行类型转换时,我有时会感到困惑,它们到底返回了什么? LPVOID lpFunction; DWORD dw = (DWORD)lpFunction; // What does it
我可以在 C 中使用 void* 而不是 LPVOID 吗? 或者 LPVOID 比 void* 执行一些特殊的功能。 最佳答案 C 中没有 LPVOID 类型,这是 Windows 的东西。 存在这
我收到这个奇怪的错误: MyView:OnInitialUpdate() { int* my_int; *(my_int) = 1; AfxBeginThread(MyThre
我是一名优秀的程序员,十分优秀!