Передача HBitmap из dll на Delphi в приложение на C#

Есть библиотека на Delphi. У нее функция, которая рисует изображение и возвращает его HBitmap:

function TRGOpenHandle(FileName:PAnsiChar; Release:boolean):LongWord; stdcall; export;
begin
if FActive then
  begin
    try
    TRG.Clear;
    TRG.ClearBackground;
    TRG.LoadFromFile(FileName);
    TRG.ClearBackground;
    if Release then result:=TRG.Image.Picture.Bitmap.ReleaseHandle
    else            result:=TRG.Image.Picture.Bitmap.Handle;
    except on E:Exception do
      begin
      MessageBox(0, PAnsiChar(E.Message), 'TRG.DLL', MB_OK + MB_ICONWARNING);
      FActive:=false;
      result:=0;
     end;
    end;
  end else
  begin
  result:=0;
  end;
end;


Если вызывать эту dll из приложения на Delphi, то все работает нормально, изображение отрисовывается. Если вызывать dll из приложения на C#, то изображение неотрисовывается, Image заливается просто белым цветом.

Вызов из C#:

LibWrap.TRGInit();
                        bmp = Bitmap.FromHbitmap((IntPtr)LibWrap.TRGOpenHandle(files[i], false));
                        files[i] = System.IO.Path.GetFileNameWithoutExtension(files[i]);
                        bmp.Save(tiffPath + "\\" + files[i] + ".tif", System.Drawing.Imaging.ImageFormat.Tiff);


Стоит только добавить в функцию dll вызов модального окна (именно модального), то и в c# все отрисовываетяс отлично. Но работать с постоянно выскакивающими модальными окнами невозможно. Что можно сделать?

Код функции при добавлении вызова модального окна:

function TRGOpenHandle(FileName:PAnsiChar; Release:boolean):LongWord; stdcall; export;
begin
if FActive then
  begin
    try
    TRG.Clear;
    TRG.ClearBackground;
    TRG.LoadFromFile(FileName);
Form2.ShowModal;
    TRG.ClearBackground;
    if Release then result:=TRG.Image.Picture.Bitmap.ReleaseHandle
    else            result:=TRG.Image.Picture.Bitmap.Handle;
    except on E:Exception do
      begin
      MessageBox(0, PAnsiChar(E.Message), 'TRG.DLL', MB_OK + MB_ICONWARNING);
      FActive:=false;
      result:=0;
     end;
    end;
  end else
  begin
  result:=0;
  end;
end;


Так же отрисовываетяс, но через раз если сделать так:

function TRGOpenHandle(FileName:PAnsiChar; Release:boolean):LongWord; stdcall; export;
begin
if FActive then
  begin
    try
    TRG.Clear;
    TRG.ClearBackground;
    TRG.LoadFromFile(FileName);
    TRG.ClearBackground;
    Application.ModalStarted;
    Application.HandleMessage;
    Application.ModalFinished;
    Application.ProcessMessages;
    if Release then result:=TRG.Image.Picture.Bitmap.ReleaseHandle
    else            result:=TRG.Image.Picture.Bitmap.Handle;
    except on E:Exception do
      begin
      MessageBox(0, PAnsiChar(E.Message), 'TRG.DLL', MB_OK + MB_ICONWARNING);
      FActive:=false;
      result:=0;
     end;
    end;
  end else
  begin
  result:=0;
  end;
end;


Подскажите как решить эту проблему, или хотя бы как убивать модальное окно программно. В чем может быть загвоздка, почему именно при вызове модального окна все срабатывает, а без него нет?

Комментарии (1)

RSS свернуть / развернуть
+
0
Решение найдено. Надо разделить метод рисующий изображение и возвращающий его HBitmap. Код dll вот такой:
function TRGGetHBitmap():LongWord; stdcall; export;
begin
  result:=TRG.Image.Picture.Bitmap.Handle;
end;

procedure TRGOpen1(FileName:PAnsiChar; Release:boolean) stdcall; export;
begin
if FActive then
  begin
    try
    TRG.Clear;
    TRG.ClearBackground;
    TRG.LoadFromFile(FileName);
    TRG.LoadFromFile(FileName);
    TRG.ClearBackground;
    except on E:Exception do
      begin
      MessageBox(0, PAnsiChar(E.Message), 'TRG.DLL', MB_OK + MB_ICONWARNING);
      FActive:=false;
      end;
   end;
  end;
end;


В приложении на C#:
LibWrap.TRGInit();
                        LibWrap.TRGOpen1(files[i], false);
                        Application.DoEvents();
                        bmp = Bitmap.FromHbitmap((IntPtr)LibWrap.TRGGetHBitmap());
                        //bmp = Bitmap.FromHbitmap((IntPtr)LibWrap.TRGOpenHandle(files[i], false));
                        files[i] = System.IO.Path.GetFileNameWithoutExtension(files[i]);
                        bmp.Save(tiffPath + "\\" + files[i] + ".tif", System.Drawing.Imaging.ImageFormat.Tiff);


Инициализация dll:
[DllImport("TRGACSharp.dll")]
            public static extern void TRGOpen1([MarshalAs(UnmanagedType.LPStr)] string str, bool a);

            [DllImport("TRGACSharp.dll")]
            public static extern int TRGGetHBitmap();
avatar

mastersoftna

  • 18 ноября 2011, 16:31

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.