Существует хороший 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?