C++ 从LPVOID检索字符串
有人能解释一下并帮我吗。 假设我有这样一个函数,其中lpData包含指向所需数据的指针C++ 从LPVOID检索字符串,c++,string,C++,String,有人能解释一下并帮我吗。 假设我有这样一个函数,其中lpData包含指向所需数据的指针 void foo(LPVOID lpData) { } 什么是正确的检索方法。这很管用,但最后我看到了一些奇怪的角色 void foo(LPVOID lpData) { LPVOID *lpDataP = (LPVOID *)lpData; char *charData = (char*)lpDataP; //i log charData.... } 我更喜欢使用字符串,但我不知道如何检
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);
string*datastring=reinterpret\u cast(lpData);
这就是我所尝试的。至少有两种方法:
void foo(LPVOID lpData)
{
char *charData = (char*)lpData;
//i log charData....
}
或
void foo(LPVOID lpData)
{
char*charData=static\u castlpData;
//我记录charData。。。。
}
这很管用,但最后我看到了一些奇怪的角色
void foo(LPVOID lpData) {
LPVOID *lpDataP = (LPVOID *)lpData;
char *charData = (char*)lpDataP;
//i log charData....
}
这意味着您的字符串不是以null结尾的,也就是说,它没有标记字符串结尾的NUL
字节(0
)
C字符串必须是。*当您记录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只是指向一堆字符。您的意思是要将这些字符解释为字符串
对象。但是字符串
对象是一些标题信息(可能是长度和容量等)加上指向一组字符的指针。把一个当作另一个会导致垃圾或崩溃***
<>是,你使用C++,不是C,但是<代码> char */COD>是“C字符串”。 **如果您确实有一个保持活动状态的
字符串对象,并且您将指向该对象的指针隐藏在LPVOID
中,并且现在已检索到它(例如,使用SetWindowLongPtr
/GetWindowLongPtr
),那么从LPVOID
转换为string*
是有意义的。但我怀疑你在做什么。(如果是,则不需要重新解释转换。void*
的全部要点是它不被解释,因此没有什么可以重新解释的。只需使用静态转换
)
***或者,最糟糕的是,它可能看起来有效,但随后会导致难以跟踪的崩溃或腐败。某些标准C++库使用一个特殊的分配器将字符头放在字符之前,并返回指向第一个字符的指针,以便在代码< char *< /COD>可以使用的任何地方使用<代码>字符串。在字符串
类中,每个方法都必须向后伪造这个
指针;例如,它不只是说m_length
,而是做一些类似于static_cast(this)[-1]>m_length
。但是另一种方法是不可行的,如果你只有一堆字符,而不是一个字符串
对象,那么福吉将读取恰好在字符之前分配的任何字节,并尝试将它们解释为整数,因此你可能会认为你有一个长度为0的字符串,或182423742341241243。LPVOID
已经是void*
。如果你传递一个指向std::string
,只需使用static\u cast
。你为什么要从LPVOID
(void*
,指向任何东西的指针)到LPVOID*
(void**
,指向任何东西的指针)进行转换呢?谢谢你解释得很好,我犯了很多错误。
string *datastring = reinterpret_cast<std::string *>(lpData);