LPCWSTR DesPath = (StringUtil::StrToWstr(setting)).c_str();`
Это создает временный wstring
, который выходит из области видимости сразу после назначения DesPath
, оставляя DestPath
висящим и указывая на недопустимую память. Вам нужно сначала сохранить результат StrToWstr()
в локальной переменной wstring
, а затем вызывать c_str()
для нее, поэтому строковая память остается в области видимости:
wstring wstr = StringUtil::StrToWstr(setting);
LPCWSTR DesPath = wstr.c_str();
В противном случае вызовите StrToWstr().c_str()
непосредственно во входном параметре ExpandEnvironmentStringsForUser()
:
ExpandEnvironmentStringsForUser(hToken, StringUtil::StrToWstr(setting).c_str(), ExpandedDesPath, MAX_PATH - 1);
These are the solutions I've found so far in order of relevance:
Use ON_COMMAND_RANGE
if you can define the range of the control IDs you want to handle.
Overload CWnd::PreTranslateMessage()
and do whatever stuff you want with the messages received. NOTE: When dealing with buttons, take into account that the BN_CLICKED event is NOT sent to PreTranslateMessage but directly sent to the window procedure.
Overload CWnd::WindowProc()
and do whatever stuff you want with the messages received. NOTE that when dealing with buttons this is the ONLY WAY I've found to handle the BN_CLICKED event.
Interesting links:
I hope this helps... thank you all for your contributions.
Несмотря на то, что вы не знаете точных значений идентификатора, если вы знаете возможный диапазон идентификаторов, то можно использовать следующий макрос.
BEGIN_MESSAGE_MAP(MyDialog, CDialog)
...
...
ON_COMMAND_RANGE(1000, 5000, OnButtonDynamic)
END_MESSAGE_MAP()
void MyDialog::OnButtonDynamic(UINT nID)
{
}
Это будет работать для идентификаторов в диапазоне 1000 - 5000.
Я считаю, что эта статья довольно хорошо объясняет это и имеет исходный код. Я не пробовал это, поэтому не могу гарантировать, что это сработает, но в то время я подумал, что это может помочь.
Подробную информацию (и многое другое) о немодальных диалогах можно найти здесь .
вставьте запись идентификатора обработчика в Resouce.h Затем вставьте запись в карту сообщений обработчика, например ON_BN_CLICKED (IDC_BTNCREATE, OnBnClickedrunCreated) , или вы можете напрямую использовать целочисленный идентификатор как ON_BN_CLICKED (1200, OnBnClickedrunCreated). Если вы используете вторую версию, то нет необходимости вставлять запись в resource.h. Дайте определение и объявление обработчика в файлах .h и .cpp. вы получите свой ответ.