Использование WM_COPYDATA только между процессами одного и того-же приложения

Я изучаю программирование под Win32. Хочу написать приложение которое может обмениваться сообщениями WM_COPYDATA между собственными экземплярами. Ниже приведен примерный код, как это делается исходя из многочисленных примеров.

Объявляем комманды:

enum COMMANDS { COMMAND1, COMMAND2, COMMAND3 };

Посылаем команду:

HWND hWnd = FindWindow(...);
if (hWnd != NULL) {
  COPYDATASTRUCT cds = {0};
  cds.dwData = COMMAND1;
  SendMessage(hWnd, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)(LPVOID)&cds);
  CloseHandle(hWnd);
}

Обрабатываем команды:

LRESULT Wndproc(HWND hWnd, UINT uMsg, WPARAM WPARAM wParam, LPARAM lParam) {
  
  switch (uMsg) {
    ...
    case WM_COPYDATA:
      COPYDATASTRUCT* pcds = (COPYDATASTRUCT*)lParam;
      switch (pcds->dwData) {
        case COMMAND1: ... ; break;
        case COMMAND2: ... ; break;
        case COMMAND3: ... ; break;
      } 
      return TRUE;
    ...
  }

  return FALSE;
}

Однако есть один вопрос. На этапе посылки команды другому экземпляру приложения требуется знать HANDLE его окна. Для нахождения его в примерах используется функция FindWindow. Но как я понимаю, этот вариант не гарантирует уникальности. В связи с этим у меня несколько вопросов:

  1. Правильно ли я понимаю, что теоретически, в системе могут существовать окна сторонних приложений с тем же классом и именем, если другой разработчик использовал схожие имена. И в таком случае FindWindow теоретически может вернуть описатели окон сторонних праложений и WM_COPYDATA отправится к сторонним приложениям. Конечно я понимаю, что вероятность не велика, но теоретически это же может приводить к сбоям, если и стороннее ОДНОИМЕННОЕ приложение как-то обрабатывает сообщения WM_COPYDATA.

  2. Каким образом можно сделать, чтобы приложение находило только свои собстенные экземпляры запущенные в системе и гарарнтированно посылало сообщение WM_COPYDATA лишь только им.


Ответы (0 шт):