Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将void*值正确转换为CString_C++_Mfc - Fatal编程技术网

C++ 如何将void*值正确转换为CString

C++ 如何将void*值正确转换为CString,c++,mfc,C++,Mfc,我试图弄清楚如何使用void*值,我知道它的前一个值(调用函数时)是CString。下面是一个例子: 在某个时刻,这个变量中有一个CString值:sNumBlue值可以类似于:“0000000000000000 59841145” 在最后一行代码中,它将CString值发送给另一个函数,该函数将其作为void*接收,该函数已经有了一种使用类处理void*的方法,但我不能使用该类,因为它被设计为接收另一个不同的值或其他我似乎不理解的东西,当我尝试使用它时,出现异常。以下是该函数: LRESULT

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

在某个时刻,这个变量中有一个CString值:sNumBlue值可以类似于:“0000000000000000 59841145”

在最后一行代码中,它将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
       }
}
这就是我迄今为止所尝试的:

  • 我试着这样把它扔给Cstring:

    CString*pMyNum=静态投影(pBlueRd)

  • 但我认为这是不对的,我做错了什么,因为当我试图打印pMyNum值时,它会显示其他内容,而不是所需的值

  • 我尝试复制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);
    
    添加了消息\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;
    }