@igamity

Delphi to C#

Добрый день!

Столкнулся с проблемой, которая возникла в процессе перевода программы с 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.PageReadWrite0, Int32.MaxValue"MM_MAP");
  if (fh != IntPtr.Zero)
  {
    IntPtr fd = (IntPtr)Win32API.MapViewOfFile(fh, Win32API.FileMapAccess.FileMapWrite000);
    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 указано именно так.


Кто нибудь может подсказать в чем может быть дело и как решить проблему?
  • Вопрос задан
  • 3824 просмотра
Решения вопроса 1
VenomBlood
@VenomBlood
sizeof(longint) и Int32.MaxValue? sizeof же в делфи возвращает размер используемой памяти под переменную? Просто Int32.MaxValue — это два миллиарда с копейками.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
PashaPash
@PashaPash
Попробуйте использовать стандартый класс System.IO.MemoryMappedFiles.MemoryMappedFile, и просто писать this.Handle в BinaryWriter из примера.

Значение WM_COPYDATA в коде нигде не используется, кстати.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы