Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DLL Funktionsaufruf (https://www.delphipraxis.net/97864-dll-funktionsaufruf.html)

Neutral General 17. Aug 2007 14:24


DLL Funktionsaufruf
 
Hi,

Ich rufe eine ganz simple, aus einer DLL importierte procedure auf. Sie liefert mir (glaube ich) korrekte Daten aber danach bekomme ich eine Zugriffsverletzung.


Delphi-Quellcode:
type
  VERSIONINFO = packed record
    cbSize: DWORD;
    dwMajorVersion: DWORD;
    dwMinorVersion: DWORD;
    dwBuildNumber: DWORD;
    dwPlatformID: DWORD;
  end;
  PVERSIONINFO = ^VERSIONINFO;

function DllGetVersion(out pdvi: PVERSIONINFO): HRESULT; stdcall; external 'cabinet.dll';

implementation

procedure TForm1.Button1Click(Sender: TObject);
var x: PVERSIONINFO;
begin
  New(x);
  x^.cbSize := SizeOf(VERSIONINFO);
  DLLGetVersion(x);
  ShowMessage(IntToStr(x.dwMajorVersion) + '.'+ IntToStr(x.dwMinorVersion));
  Dispose(x);
end;
Das Record ist eigentlich 100%ig richtig. Die Version sieht original so aus:

Code:
HRESULT DllGetVersion(DLLVERSIONINFO* pdvi)
Mache ich da was falsch? Mit FreeMem statt Dispose hab ichs auch schon probiert. Oder ich hab den Speicher gar nicht freigegeben aber das nutzt auch nichts -.-

Gruß
Neutral General

angos 17. Aug 2007 14:34

Re: DLL Funktionsaufruf
 
Hallo Michael,


ich hatte hier letztens ein ähnliches Problem.... Bei mir kam ebenfalls nach dem Aufruf der Funktion eine AV. Bei mir lag es daran, dass ich ShareMem nur in einem der beiden Projekte (Programm und DLL) aktiviert hatte. Prüfe das mal auf diese Gegebenheit hin... ich hab da auch lange suchen müssen und fast nen Brechreiz bekommen, wo ich das herausgefunden hatte -.-

Gruß

sirius 17. Aug 2007 14:35

Re: DLL Funktionsaufruf
 
Bist du dir mit stdcall sicher?

Neutral General 17. Aug 2007 14:36

Re: DLL Funktionsaufruf
 
Mh das ganze ist einfach kein out-Parameter... Das stand irgendwo fälschlicherweise in ner Dokumentation... Hat sich erledigt. Danke :)

Muetze1 17. Aug 2007 14:45

Re: DLL Funktionsaufruf
 
Richtig, weil sonst der mit New() angelegte Speicher von dem von der DLL zurück gegebenen Pointer überschrieben wird und Dispose() einen fremden Speicher freigeben muss. Dieser ist sogar höchstwahrscheinlich sogar statisch in der DLL vorhanden für die Struktur und von daher stößt das Dispose() bzw. dem MemoryManager ganz sauer auf.

Neutral General 17. Aug 2007 14:54

Re: DLL Funktionsaufruf
 
Gibt was neues:

Delphi-Quellcode:
function DllGetVersion(var pdvi: DLLVERSIONINFO): HRESULT; stdcall; external 'cabinet.dll';
so muss es sein. Mein Aufruf im Moment:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var x: DLLVERSIONINFO;
begin
  FilLChar(x,SizeOf(DLLVERSIONINFO),0);
  x.cbSize := SizeOf(DLLVERSIONINFO);
  DLLGetVersion(x);
  ShowMessage(IntToStr(x.dwMajorVersion) + '.'+ IntToStr(x.dwMinorVersion));
end;
DLLGetVersion liefert mir $12F618. GetLastError liefert mir "Alles in Ordnung". Im Idealfall soll DLLGetVersion S_OK ($00000000) zurückliefern. Jedoch finde ich auch sonst nichts was $12F618 entspricht. Angezeigt wird mir nämlich Version 0.0 (was wohl sehr wahrscheinlich von meinem FillChar kommt......)

Gruß
Neutral General

sirius 17. Aug 2007 15:28

Re: DLL Funktionsaufruf
 
Zitat:

Zitat von Neutral General
DLLGetVersion liefert mir $12F618. GetLastError liefert mir "Alles in Ordnung". Im Idealfall soll DLLGetVersion S_OK ($00000000) zurückliefern. Jedoch finde ich auch sonst nichts was $12F618 entspricht. Angezeigt wird mir nämlich Version 0.0 (was wohl sehr wahrscheinlich von meinem FillChar kommt......)

Wie liefert dir DLLGetVersion $12F618 (sieht übrigens nach einer StackAdresse aus)
Wie, und was wird dir wo angezeigt? Ich verstehe dich nicht :cry:

Neutral General 17. Aug 2007 15:53

Re: DLL Funktionsaufruf
 
Zitat:

Zitat von sirius
Zitat:

Zitat von Neutral General
DLLGetVersion liefert mir $12F618. GetLastError liefert mir "Alles in Ordnung". Im Idealfall soll DLLGetVersion S_OK ($00000000) zurückliefern. Jedoch finde ich auch sonst nichts was $12F618 entspricht. Angezeigt wird mir nämlich Version 0.0 (was wohl sehr wahrscheinlich von meinem FillChar kommt......)

Wie liefert dir DLLGetVersion $12F618 (sieht übrigens nach einer StackAdresse aus)
Wie, und was wird dir wo angezeigt? Ich verstehe dich nicht :cry:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var x: DLLVERSIONINFO;
begin
  FilLChar(x,SizeOf(DLLVERSIONINFO),0);
  x.cbSize := SizeOf(DLLVERSIONINFO);
  ShowMessage(IntToHex(DLLGetVersion(x),6));
  ShowMessage(SysErrorMessage(GetLastError));
  ShowMessage(IntToStr(x.dwMajorVersion) + '.'+ IntToStr(x.dwMinorVersion));
end;
Zitat:

---------------------------
Cabtestapp
---------------------------
12F618
---------------------------
OK
---------------------------

Zitat:

---------------------------
Cabtestapp
---------------------------
Der Vorgang wurde erfolgreich beendet
---------------------------
OK
---------------------------
Zitat:

---------------------------
Cabtestapp
---------------------------
0.0
---------------------------
OK
---------------------------
Alles klar? :mrgreen:

hoika 17. Aug 2007 16:22

Re: DLL Funktionsaufruf
 
Hallo,

wie Neutrag General zeigt,
ist es am einfachsten die Deklaration der Dll-Methode zu ändern.

Delphi-Quellcode:
type
  TRec = record
  end;
  PRec = ^TRec;

procedure Foo1(var Rec: TRec);
procedure Foo2(PRec: TRec);
Foo1 und Foo2 sind das praktisch gleiche, Foo1 ist aber einfacher zu handhaben,
weil du keinen Zeiger benutzen musst.


Heiko

Neutral General 17. Aug 2007 16:32

Re: DLL Funktionsaufruf
 
Ehm ich sollte vielleicht erwähnen das die DLL nicht mir "gehört". Ich hab den Quellcode der DLL nicht... Ich kann mir also nicht aussuchen wie ich das ganze deklariere. Kann mir jemand sagen was jetzt noch schief läuft? (Siehe meinen vorherigen oder vorvorherigen Post).

Gruß
Neutral General


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:53 Uhr.
Seite 1 von 2  1 2      

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