У меня возникла проблема с содержимым указателя, переданного как wParam из 32-разрядного приложения C#, изменяющегося по пути к 64-разрядному процессу на C++.Параметры PostMessage от 32-разрядного C# до 64-разрядного C++
Существует два процесса: 32.exe (в C#) и 64.exe (в C++). 64.exe запускается как дочерний процесс 32.exe. 32.exe post window message для 64.exe, один из которых имеет wParam, который является указателем на массив структур RECT. Оба 64.exe и 32.exe имеют общую DLL (написанную на C++, но скомпилированную для разных платформ, конечно), называемую 32.dll и 64.dll.
Функция, ожидающая RECT * в 32.dll, вызывается непосредственно из 32.exe с тем же RECT *, который позже отправлен, и это работает хорошо. Затем он отправляет сообщение 64.exe, который вызывает ту же функцию и отливает WPARAM в Rect *:
else if (WM_SetDisabledAreas == message)
{
SetDisabledAreas((RECT*)wParam, (UINT)lParam);
}
Сообщение опубликовано следующим образом:
if (Is64Bit() && SubProcess64 != null)
{
Win32.PostMessage(SubProcess64.MainWindowHandle, WindowMessages.SetDisabledAreas,
(uint)pointer.ToInt32(), length);
}
MessageBox.Show(pointer.ToString());
DLL32.SetDisabledAreas(pointer, length);
отладкой я подтверждено что сообщение получено, однако адрес wParam не совпадает с предыдущим. Это не является неожиданным, но содержимое памяти, на которое он указывает теперь, не определено (и я получаю нарушение доступа при попытке увидеть, что там есть).
Что здесь происходит?
Можете ли вы добавить источник, который включает в себя инициализацию переменной указателя? – Jason
Точно как в этом вопросе: http://stackoverflow.com/questions/1086294/convert-array-of-structs-to-intptr –
Возникает ли проблема, если вы используете SendMessage? – Jason