gpt4 book ai didi

c++ - 从 LPVOID 中检索字符串

转载 作者:搜寻专家 更新时间:2023-10-31 01:43:51 25 4
gpt4 key购买 nike

有人可以在这里解释并帮助我吗?可以说我有这样的功能,其中 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_castvoid * 的全部意义在于它没有被解释,所以没有什么可以重新解释的。只需使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com