首页 > 解决方案 > 如何正确地将 void * 值转换为 CString

问题描述

我试图弄清楚如何使用 void * 值,我知道它的先前值(调用函数时)是 CString。这是一个例子:

在某些时候,这个 var 中有一个 CString 值:sNumBlue值可能类似于:“000000000000000059841145”

pNumBlue = new CString(sNumBlue);
PostMessage (WM_BLUERD,DEF_BLUE_ADD_BLUE,(long)pNumBlue);

使用最后一行代码,它将 CString 值发送到另一个函数,该函数将其作为 void* 接收,该函数已经有一种使用类处理 void * 的方法,但我不能使用该类,因为它是旨在接收另一个我似乎不理解的不同值或其他东西,当我尝试使用它时,会出现异常。这是那个功能:

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
       }
}

这是我到目前为止所尝试的:

  1. 我试图像这样将它转换为 Cstring:

    CString* pMyNum = static_cast(pBlueRd);

但我不认为是正确的,我做错了,因为当我尝试打印pMyNum值时,它会显示其他内容而不是所需的值。

  1. 我试图复制 CColorRead 类并给它一个 set 和 get 函数。在调用 CDat_color::OnBlueRd 之前,我使用 set 函数设置了 sNumBlue 值。当我在函数 OnBlueRd 中时尝试获取该值,但此时该值为 NuLL,或者当我尝试获取它时它会引发异常。

我能做些什么来安全地获得价值?谢谢大家,如果问题没有很好地编辑,我很抱歉,我是用手机问的,我会尝试从电脑上修复它。随意问我任何相关的事情,老实说,我不是一个伟大的 C++ 程序员,我每天都在学习新事物。顺便说一句,我正在使用 Visual C++ 2006 和 MFC 框架。再次感谢

编辑:

这是消息处理程序:

afx_msg LRESULT OnBlueRd(short shErr=0,void *pNum=NULL);

添加了 MESSAGE_MAP:

BEGIN_MESSAGE_MAP(CDat_color, CDialog)
    ON_MESSAGE(WM_BLUERD,OnBlueRd)
END_MESSAGE_MAP()

标签: c++mfc

解决方案


对于ON_MESSAGE条目,函数的签名必须是这样的:

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

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;
}

推荐阅读