[英]retrieving string from LPVOID
有人可以在这里解释和帮助我吗? 可以说我有这样的功能,其中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);
我正在努力。
这有效,但最后我得到奇怪的字符
这意味着您的字符串不是以Null结尾的,也就是说,它没有NUL
字节( 0
)来标记字符串的结尾。
C字符串必须以空值结尾 。*当您记录C字符串( char *
)时,它将一直记录字符,直到找到NUL
为止。 如果字符串末尾没有一个,它将继续遍历随机内存,直到找到一个(或者直到遇到页面错误并崩溃)为止。 这不好。 而且没有办法解决它; 一旦丢失长度,就无法恢复长度。
但是,未终止的字符串及其长度可能会很有用。 许多函数可以将char *
旁边的长度作为附加参数(例如, string
构造函数)或其他形式(例如, printf
格式字符串中的宽度说明符)。
因此,如果您采用该长度,并且仅调用也采用该长度的函数(或者只是制作一个以空值结尾的副本并使用该长度),就可以了。 所以:
void foo(LPVOID lpData, int cchData) {
string sData(static_cast<const char *>(lpData), cchData);
// now do stuff with sData
}
同时,从LPVOID
(aka void *
,又称指针指向任何东西)转换为LPVOID *
(aka void **
,又称指针指向任何东西的指针)然后再转换为char *
(指针到字符)是错误的(并且应该在第二次转换中向您发出编译器警告;如果您收到警告而忽略了它们,请不要这样做!)。 而且,通常最好使用现代强制转换而不是C样式强制转换,并且在没有缺点的情况下最好使用const正确; 它只是使事情对读者而言更加明确,并在将来进行维护时更加安全。
最后:
string *datastring = reinterpret_cast<std::string *>(lpData);
几乎可以肯定这是错误的。** LPVOID
只是指向一堆字符。 您说的是要将这些字符解释为好像是string
对象。 但是string
对象是一些标头信息(可能是长度和容量等)以及指向一串字符的指针。 将其中一个当作另一个会导致垃圾或崩溃。***
*是的,您使用的是C ++,而不是C,但是char *
是“ C字符串”。
**如果实际上有一个string
对象,并且该string
对象一直存在于某个地方,并且将指向该对象的指针保存在LPVOID
,并且现在已经对其进行了检索(例如,使用SetWindowLongPtr
/ GetWindowLongPtr
),则将其从LPVOID
为string *
会很有意义。 但是我怀疑那是你在做什么。 (如果是,则不需要reinterpret_cast
void *
的全部要点是它没有被解释,因此没有什么可以从其重新解释的。只需使用static_cast
。)
***或者,最糟糕的是,它似乎可以工作,但随后导致难以跟踪的崩溃或损坏。 一些标准的C ++库使用特殊的分配器将标头放在字符之前,并返回指向第一个字符的指针,以便可以在char *
可以使用的任何地方使用string
。 在string
类内部,每个方法都必须使this
指针向后移动。 例如, m_length
做static_cast<_string_header *>(this)[-1]->m_length
。 但是另一种方法不起作用-如果您只有一堆字符,而不是string
对象,该软糖将读取恰好在字符之前分配的所有字节,然后尝试将它们解释为整数,因此您可能最终以为您的字符串长度为0或182423742341241243。
至少有两种方法:
void foo(LPVOID lpData)
{
char *charData = (char*)lpData;
//i log charData....
}
要么
void foo(LPVOID lpData)
{
char *charData = static_cast<char*>lpData;
//i log charData....
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.