У меня есть приложение C ++ wxWidgets, в котором я пытаюсь подавить дополнительный значок, который появляется в области уведомлений, когда мне нужно отобразить уведомление (тост) для пользователя.
Для этого мне нужно вызвать wxNotificationMessage :: MSWUseToasts , что при Windows 10 подавит этот значок.
Параметры для вызова этой функции являются ярлыками путь к файлу и идентификатор модели пользователя приложения.
Если посмотреть на реализацию того, как wxWidgets выполняет Toast Notification, для ярлыка будет добавлено расширение lnk
, а также добавлен абсолютный путь к нему. Поэтому для параметра я просто передаю имя приложения в виде строки.
Для второго параметра, согласно Microsoft docs , он похож на «MyCompany.MyApp».
Эта функция возвращает bool
, который возвращает false
при вызове с двумя параметрами. Но если я вызываю функцию с одним параметром, она возвращает true
. Приведенная ниже ошибка возникает в обоих случаях.
Я использую Inno Setup для установки моего приложения и задаю AppUserModelID:
[Icons]
Name: "{group}\MyApp"; Filename: "{app}\MyApp.exe"; AppUserModelID: "MyCompany.MyApp"
Name: "{autodesktop}\MyApp"; Filename: "{app}\MyApp.exe"; AppUserModelID: "MyCompany.MyApp"
Таким образом, когда я вызываю метод MSWUseToasts
, все работает как и ожидалось, но когда я закрываю свое приложение, я в основном получаю исключение COM-указателя, в частности, от wxWidgets wxCOMPtr
. Исключение составляет:
Exception thrown: read access violation.
wxToastNotifMsgImpl::ms_toastMgr.m_ptr->**** was 0x78F253C0. occurred
Visual Studio прерывает ошибку в файле comptr.h
здесь:
void reset(T* ptr = NULL)
{
if ( m_ptr != ptr)
{
if ( ptr )
ptr->AddRef();
if ( m_ptr )
m_ptr->Release(); // error occurs here
m_ptr = ptr;
}
}
Я недостаточно знаю ни о COM, ни о том, как работают уведомления о тостах за кулисами, которые абстрагируются от wxWidgets, чтобы узнать, в чем именно заключается проблема.
Приложение:
С некоторым поиском в Google я нашел это из существующего ответа StackOverflow, Я использовал последнюю ссылку, опубликованную в ответе на здесь , где я скопировал код, размещенный в конце документа, в исполняемый файл и применил его к PID приложения, и для моего процесса он возвращает APPMODEL_ERROR_NO_APPLICATION
что означает The process has no application identity.
Не уверен, что это может соответствовать моей проблеме. Погуглив эту ошибку, вы получите результаты только для проблем, связанных с отсутствием идентификации пакета