Ошибка с подавлением значка в области Windows на панели уведомлений через wxWidgets - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть приложение 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. Не уверен, что это может соответствовать моей проблеме. Погуглив эту ошибку, вы получите результаты только для проблем, связанных с отсутствием идентификации пакета

...