Безопасно ли использовать WM_COPYDATA между 64- и 32-битными (WOW64) приложениями? - PullRequest
0 голосов
/ 07 ноября 2019

Существует хороший SO Q / A-сеанс по общему использованию WM_COPYDATA сообщений здесь и "обсуждение" того, будет ли это работать между приложениямиотличается 32/64-битность здесь . Однако последний, похоже, сфокусирован на возможном неправильном использовании передаваемого «указателя данных». Итак, я поднимаю новый вопрос здесь.

Я работаю над тем, чтобы два приложения Windows взаимодействовали / синхронизировались друг с другом, и в качестве первого этапа я использую Windows Messaging для реализации этого. ,Все кажется пока нормально ... но я использую сообщение WM_COPYDATA для передачи информации между приложениями.

Мой вопрос: Этот подход гарантированно в безопасности, когда два приложения имеют разную (32/64) битность? Я провел несколько тестов с использованием приведенного ниже кода со всеми четырьмя возможными комбинациями 32 и 64 сборок между «клиентом» и «сервером», и все они работают как положено;но это только потому, что я получаю «счастливые» результаты (из-за возможного неопределенного поведения), или система WOW64 (особенно когда сервер 64-битный, а клиент 32) позаботится обо всем необходимом распределении?

Если кто-нибудь может подтвердить, что он гарантированно работает, я был бы очень признателен за «официальную» ссылку / ссылку, подтверждающую это.

Общий заголовочный файл:

static const WPARAM nmIdFilePath = 0x00001100;

struct nmLockInfoType {
    char filePathID[1024];
    // More elements will be added later!
};
static const nmLockInfoType nmLockInfoDefault = {
    "<<<Uninitialised Image Data Path>>>",
    //...
};
extern nmLockInfoType nmLockInfo; // MUST be provided by each app!
///nmLockInfoType nmLockInfo = nmLockInfoDefault; // Use this code to instatiate it (once, somewhere)!

Код программы сервера(внутри обработчика для сообщения RegisterWindowMessage(L"HANDSHAKE");):

//...
COPYDATASTRUCT cds;
cds.dwData = nmIdFilePath;           // Pre-defined ID
cds.cbData = sizeof(nmLockInfoType);
cds.lpData = &nmLockInfo;            // Pre-defined structure (see above)
//...
// Send a copy of the "Welcome Pack" data structure to the client app ...
::SendMessage(clientLock, WM_COPYDATA, WPARAM(m_hWnd), LPARAM(&cds)); // "clientLock is the HWND of the client app's MainWnd

Код клиентской программы:

BOOL MyFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
    switch (pCopyDataStruct->dwData)
    {
    case nmIdFilePath:
        memcpy(&nmLockInfo, pCopyDataStruct->lpData, pCopyDataStruct->cbData);
        return nmsSucceeded; // This is NON_ZERO so evaluates to TRUE
    // Other cases here ...
    } 
    return CMDIFrameWnd::OnCopyData(pWnd, pCopyDataStruct);
}

Меня особенно беспокоит случай, когда клиент 32-битный, но сервер 64-битный;в таком случае это будет отправка 64-битного адреса данных в 32-битное приложение (хотя и в приложение WOW64). Обрабатывается ли встроенный «маршаллинг» в ситуациях WOW64?

...