2009-07-06 4 views
2

У меня возникла проблема с содержимым указателя, переданного как 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 не совпадает с предыдущим. Это не является неожиданным, но содержимое памяти, на которое он указывает теперь, не определено (и я получаю нарушение доступа при попытке увидеть, что там есть).

Что здесь происходит?

+0

Можете ли вы добавить источник, который включает в себя инициализацию переменной указателя? – Jason

+0

Точно как в этом вопросе: http://stackoverflow.com/questions/1086294/convert-array-of-structs-to-intptr –

+0

Возникает ли проблема, если вы используете SendMessage? – Jason

ответ

5

Каждый из двух процессов имеет собственное адресное пространство, так что указатель из процесса 32.exe недействителен в 64.exe.

Однако это не имеет никакого отношения к 32-битным и 64-битным вообще. Вам просто нужно использовать технику взаимодействия между процессами по вашему выбору для передачи данных между двумя процессами.

Например, вы можете использовать CreateFileMapping для создания именованного раздела разделяемой памяти.

+0

Я знаю, что они могут иметь разные адресные пространства, но разве Windows не должна переводить это для вас, когда вы передаете указатели? –

+0

Как следует знать, что указатель (uint).ToInt32() является указателем на массив прямоугольников? И как он должен знать длину этого массива при вызове? – Timbo

+0

Windows делает перевод для сообщений, о которых он знает. Для пользовательских сообщений он не знает, что такое данные, поэтому он просто передает значения и ничего не делает для них. – Andy

 Смежные вопросы

  • Нет связанных вопросов^_^