Не может заставить Windows Common находить работающий диалог

Я действительно не понимаю эти примеры из Интернета. Они все фрагментарные. Нет простого простого примера, как сделать классический диалог поиска текста.

Я положил то, что я знаю, но не показывает никакого окна и возвращает: 2147500037 0x80004005

#include <windows.h>
#include <iostream>
#include <iomanip>

int main() {
  using namespace std;
  UINT uFindReplaceMsg;  // message identifier for FINDMSGSTRING 
  uFindReplaceMsg = RegisterWindowMessage(FINDMSGSTRING);
  wstring search_str = L"text to search";
  HWND findDialog = NULL;
  wchar_t szFindWhat[MAX_PATH];
  FINDREPLACEW fr;
  ZeroMemory( & fr, sizeof( FINDREPLACEW ) );
  fr.lStructSize = sizeof( FINDREPLACEW );
  fr.hwndOwner = NULL;
  fr.lpstrFindWhat = szFindWhat;
  fr.wFindWhatLen = MAX_PATH;
  findDialog = FindTextW(&fr);
  cout << GetLastError() << endl;
  cout << hex << GetLastError() << endl;
}

Не могли бы вы предоставить мне код, который работает, чтобы я мог строить из этого.

1 ответ

Решение

Вы не проверяете результат возврата из FindTextW, То есть у вас есть:

findDialog = FindTextW(&fr);
cout << GetLastError() << endl;

Если функция завершается успешно, результатом является дескриптор. Если функция завершается ошибкой, возвращаемое значение равно NULL.

Согласно документации:

Если функция завершается ошибкой, возвращаемое значение равно NULL. Чтобы получить расширенную информацию об ошибке, вызовите функцию CommDlgExtendedError. CommDlgExtendedError может возвращать один из следующих кодов ошибок:

Другими словами, GetLastError не скажет вам ничего значимого. Вызов CommDlgExtendedError после того, как вы проверите ручку, чтобы увидеть, если это NULL.

Другие вопросы по тегам