C++ 如何将void*值正确转换为CString
我试图弄清楚如何使用void*值,我知道它的前一个值(调用函数时)是CString。下面是一个例子: 在某个时刻,这个变量中有一个CString值:sNumBlue值可以类似于:“0000000000000000 59841145” 在最后一行代码中,它将CString值发送给另一个函数,该函数将其作为void*接收,该函数已经有了一种使用类处理void*的方法,但我不能使用该类,因为它被设计为接收另一个不同的值或其他我似乎不理解的东西,当我尝试使用它时,出现异常。以下是该函数:C++ 如何将void*值正确转换为CString,c++,mfc,C++,Mfc,我试图弄清楚如何使用void*值,我知道它的前一个值(调用函数时)是CString。下面是一个例子: 在某个时刻,这个变量中有一个CString值:sNumBlue值可以类似于:“0000000000000000 59841145” 在最后一行代码中,它将CString值发送给另一个函数,该函数将其作为void*接收,该函数已经有了一种使用类处理void*的方法,但我不能使用该类,因为它被设计为接收另一个不同的值或其他我似乎不理解的东西,当我尝试使用它时,出现异常。以下是该函数: LRESULT
LRESULT CDat_color::OnBlueRd(short ColorType, void *pBlueRd )
{
CString sNumColor;
CColorRead* pColorRead;
try{
pColorRead = (CColorRead*) pBlueRd;
sNumColor = pColorRead->GetNumColor();
{Catch(catch stuff...)
//here it handles the exception
}
}
这就是我迄今为止所尝试的:
afx_msg LRESULT OnBlueRd(short shErr=0,void *pNum=NULL);
添加了消息\u映射:
BEGIN_MESSAGE_MAP(CDat_color, CDialog)
ON_MESSAGE(WM_BLUERD,OnBlueRd)
END_MESSAGE_MAP()
对于消息上的
条目,函数的签名必须为:
afx_msg LRESULT OnBlueRd(WPARAM wParam, LPARAM lParam);
你可能想要这个:
pNumBlue = new CString(sNumBlue);
PostMessage (WM_BLUERD, DEF_BLUE_ADD_BLUE, (LPARAM)pNumBlue); // LPARAM instead of LONG
调用
PostMessage
时,不会同步调用处理程序。因此,调用方不能删除CString对象。这应该在消息处理程序中完成。您可以尝试重新解释强制转换(pBlueRd)。但是我可以问你在调用这个函数的时候,你把它转换成什么(long)?在OnBlueRd(short ColorType,void*pBlueRd)
中pBlueRd
应该是与上面代码中的pNumBlue
相同的指针吗?从pNumBlue=new CString(sNumBlue)中删除pNumBlue
在哪里代码>?@harper我包含了我认为是消息句柄的内容。我无法更改条目,它必须保持不变。我使用了CString pNumBlue=(CString)lpBlueRd;我试图将其格式化为另一个CString,如:CString sNroBlue.format(“%s”,pNumBlue);但是我认为这不是正确的方法CString pNumBlue=(CString)lpBlueRd
错误,lpBlueRd
是指针。您应该更改消息映射条目,您的完全错误。阅读以下内容:我无法修改它的原因是它可以处理其他信息,我正在向这些函数中添加一些已知的内容。但是那里的数据获取方式不同,这就是为什么我必须尝试另一种方式来获取空白*。基本上,在调用OnBlueRd
之前,该值是一个CString,但它必须像void*一样由OnBlueRd
接收。问题是我无法找到正确的“转换”方法。对不起,错误的代码就是错误的代码。如果你不愿意纠正它,我也帮不了你。格式是毫无意义的,你可以简单地编写CString aux=*((CString*)pNumBlue)
,它会在格式所用时间的一小部分内做同样的事情,或者你可以直接使用*pNumBlue
,只要删除pNumBlue
。
pNumBlue = new CString(sNumBlue);
PostMessage (WM_BLUERD, DEF_BLUE_ADD_BLUE, (LPARAM)pNumBlue); // LPARAM instead of LONG
LRESULT CDat_color::OnBlueRd(WPARAM wpColorType, LPARAM lpBlueRd)
{
// wpColorType will contain DEF_BLUE_ADD_BLUE, but it's not used in your code
CString *pNumBlue = (CString*)lpBlueRd;
// do whatever needs to be done with the string *pNumBlue
delete pNumBlue; // delete it
return 0;
}