Как я могу правильно преобразовать значение void * в CString - PullRequest
1 голос
/ 21 марта 2019

Я пытаюсь выяснить, как использовать значение void *, я знаю, что его предыдущее значение (при вызове функции) является CString.Вот пример:

В какой-то момент в этой переменной есть значение 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 , он отображает другие вещи, а не желаемое значение.

Я попытался скопировать класс CColorRead и дал ему функцию set и get.Я использовал функцию set для установки значения sNumBlue перед вызовом CDat_color :: OnBlueRd.И попробуйте получить значение, когда я нахожусь внутри функции OnBlueRd, но в этот момент значение равно NuLL, или оно выдает исключение, когда я пытаюсь его получить.

Что я могусделать, чтобы получить значение безопасно?Спасибо всем, и я извиняюсь, если вопрос не отредактирован, я спрашиваю с моего телефона, я попытаюсь исправить это с ПК.Не стесняйтесь спрашивать меня о чем-либо, я, честно говоря, не очень хороший программист на C ++, я каждый день учусь чему-то новомуКстати, я использую Visual C ++ 2006 и MFC Framework.Еще раз спасибо

Редактировать:

Это обработчик сообщений:

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()

1 Ответ

1 голос
/ 21 марта 2019

Для 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...