Добрый день!
Столкнулся с проблемой, которая возникла в процессе перевода программы с Delphi на C#.
Есть следующий код Delphi:
procedure TForm1.FormCreate(Sender: TObject);
var pFD : pChar;
begin
fMH := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, sizeof(longint), 'MM_MAP');
if (fMH <> 0) then
begin
pFD := MapViewOfFile(fMH, FILE_MAP_WRITE, 0, 0, 0);
if Assigned(pFD) then
try
pLongint(pFD)^:= Self.Handle;
finally
UnmapViewOfFile(pFD);
end;
end;
end;
Я не большой знаток C#, поэтому не могу разобраться в чем проблема. Мой код:
private const int WM_COPYDATA = 0x4A;
private IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
private void Form1_Load(object sender, EventArgs e)
{
fh = Win32API.CreateFileMapping(INVALID_HANDLE_VALUE, IntPtr.Zero, Win32API.FileMapProtection.PageReadWrite, 0, Int32.MaxValue, "MM_MAP");
if (fh != IntPtr.Zero)
{
IntPtr fd = (IntPtr)Win32API.MapViewOfFile(fh, Win32API.FileMapAccess.FileMapWrite, 0, 0, 0);
if (fd != IntPtr.Zero)
try
{
Marshal.WriteIntPtr(fd, this.Handle);
}
finally
{
Win32API.UnmapViewOfFile(fd);
}
}
}
Собственно задача программы следующая: при запуске записать в память свой дескриптор (если я ничего не напутал в терминологии), после чего получать системные сообщения WM_COPYDATA, которые и нужно обрабатывать.
Потенциально я вижу три проблемных места:
- неправильно задано значение INVALID_HANDLE_VALUE, но тогда как сделать правильно я не смог найти...
- неадекватно работает Marshal.WriteIntPtr(fd, this.Handle);, в том смысле, что результат не соответствует денльфовому варианту pLongint(pFD)^:= Self.Handle;
- неправильно задано значение WM_COPYDATA, хотя в msdn указано именно так.
Кто нибудь может подсказать в чем может быть дело и как решить проблему?