Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi COM DLL / Methodenaufruf mit Rückgabe (https://www.delphipraxis.net/173089-com-dll-methodenaufruf-mit-rueckgabe.html)

Webelch 6. Feb 2013 14:49

COM DLL / Methodenaufruf mit Rückgabe
 
Hallo zusammen,
ich hab folgendes Problem an dem ich mir jetzt schon mehrere Tage die Zähne ausgebissen... Vieleicht hat hier noch jemand eine Idee. Bei Google bin ich auch nicht fündig geworden.

Ich binde eine COM Dll in meine Applikation ein die mir Images zurückgibt. Das funktioniert auch solang ich Funktionen dieser DLL nutze. Für bestimmte Formate muss ich aber Prozeduren aufrufen die mir ein Image zurück liefern. In c# funktioniert das auch hervorragend. Bei Delpi bekomme ich immer eine Acception.

Ich hab meinen Sourcecode angehängt. Vieleicht hat jemand mal zeit kurz darüber zu schauen...

Grüße

Mark
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

const
 ImageType = 102;

var
  myImageAC: TImageAC;
  myBitmapImage: TBitmapImage;
  tempBitmap: TBitmap;
  tempPicture: TPicture;

begin
  myImageAC := TImageAC.Create(Self);
  myImageAC.OpenImage('C:\Temp\DemoSlide\TestSlide');
  myImageAC.Connect;
  //
  myBitmapImage := TBitmapImage.Create(Self);
  myBitmapImage.ConnectTo(myImageAC.GetSingleImage(ImageType)); // Def. der Funktion : function GetSingleImage(ImageType: Integer): IBitmapImage;
  //
  tempPicture := TPicture.Create;
  SetOlePicture(tempPicture, myBitmapImage.Picture as IPictureDisp);
  //
  tempBitmap := TBitmap.Create;
  tempBitmap.Height := tempPicture.Height;
  tempBitmap.Width := tempPicture.Width;
  tempBitmap.Canvas.Draw(0, 0, tempPicture.Graphic);
  tempBitmap.SaveToFile('C:\temp\testBitmap.tiff');
  tempBitmap.Free;
  tempPicture.Free;
  myBitmapImage.Free; //<-------------------------------- bis hier funtioniert alles.
  //
  myBitmapImage := TBitmapImage.Create(Self);
  //
  myImageAC.GetImageMap(7, myBitmapImage); // Def. der Funktion : procedure GetImageMap(Magnification: Integer; var pPicture: IBitmapImage);
  //< Hier komm ich nicht weiter da die Variable vom Type Interface ist >
end;

sirius 6. Feb 2013 14:53

AW: COM DLL / Methodenaufruf mit Rückgabe
 
Und warum definierst du myBitmapImage nicht als Interface?

Webelch 6. Feb 2013 15:05

AW: COM DLL / Methodenaufruf mit Rückgabe
 
Bekomme ich folgende Meldung:

[dcc32 Fehler] UnitMain.pas(105): E2018 Record, Objekt oder Klassentyp erforderlich

sx2008 6. Feb 2013 15:58

AW: COM DLL / Methodenaufruf mit Rückgabe
 
Delphi-Quellcode:
var
  img : IBitmapImage;
  ...
begin
  // dein bisheriger Code hier
  ...

  img := nil;
  myImageAC.GetImageMap(7, myBitmapImage); // Def. der Funktion : procedure GetImageMap(Magnification: Integer; var pPicture: IBitmapImage);
  if not Assigned(img) then
    raise Exception.Create('Fehler bei GetImageMap(7));
  // und ab hier kann man mit dem Interface in 'img' arbeiten

Webelch 6. Feb 2013 16:24

AW: COM DLL / Methodenaufruf mit Rückgabe
 
Meinst du :

Delphi-Quellcode:
var
  img : IBitmapImage;
  ...
begin
  // dein bisheriger Code hier
  ...
  img := nil;
  myImageAC.GetImageMap(7, img); //<--------------------
  if not Assigned(img) then
    raise Exception.Create('Fehler bei GetImageMap(7));
lässt sich kompilieren aber zu Laufzeit bekomme ich eine 'access violation at 0x10004360: read of address 0x0000001c'

Webelch 6. Feb 2013 16:36

AW: COM DLL / Methodenaufruf mit Rückgabe
 
Das ist die definition aus der DLL Beschreibung.

HRESULT GetImageMap([in] long Magnification,[in, out] IBitmapImage* pPicture)

Webelch 7. Feb 2013 12:50

AW: COM DLL / Methodenaufruf mit Rückgabe
 
Hab die Lösung gefunden: :-D

Grüße

Mark

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  myImageAC: TImageAC;
  myTBitmapImage: TBitmapImage;
  myIBitmapImage: ^IBitmapImage;
  tempBitmap: TBitmap;
  tempPicture: TPicture;

begin
  myImageAC := TImageAC.Create(Self);
  myImageAC.OpenImage('C:\Temp\DemoSlide\TestSlide');
  myImageAC.Connect;
  //
  myTBitmapImage := TBitmapImage.Create(Self);
  myIBitmapImage := Pointer(myTBitmapImage.DefaultInterface);
  //
  myImageAC.GetImageMap(7, myIBitmapImage^);
  //
  tempPicture := TPicture.Create;
  SetOlePicture(tempPicture, myTBitmapImage .Picture as IPictureDisp);
  tempBitmap := TBitmap.Create;
  tempBitmap.Height := tempPicture.Height;
  tempBitmap.Width := tempPicture.Width;
  tempBitmap.Canvas.Draw(0, 0, tempPicture.Graphic);
  tempBitmap.SaveToFile('C:\temp\testBitmap.tiff');
  tempBitmap.Free;
  tempPicture.Free;
  myTBitmapImage.Free;
  myImageAC.Free;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz