![]() |
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:
Das Record ist eigentlich 100%ig richtig. Die Version sieht original so aus:
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;
Code:
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 -.-
HRESULT DllGetVersion(DLLVERSIONINFO* pdvi)
Gruß Neutral General |
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ß |
Re: DLL Funktionsaufruf
Bist du dir mit stdcall sicher?
|
Re: DLL Funktionsaufruf
Mh das ganze ist einfach kein out-Parameter... Das stand irgendwo fälschlicherweise in ner Dokumentation... Hat sich erledigt. Danke :)
|
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.
|
Re: DLL Funktionsaufruf
Gibt was neues:
Delphi-Quellcode:
so muss es sein. Mein Aufruf im Moment:
function DllGetVersion(var pdvi: DLLVERSIONINFO): HRESULT; stdcall; external 'cabinet.dll';
Delphi-Quellcode:
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......)
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; Gruß Neutral General |
Re: DLL Funktionsaufruf
Zitat:
Wie, und was wird dir wo angezeigt? Ich verstehe dich nicht :cry: |
Re: DLL Funktionsaufruf
Zitat:
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:
Zitat:
Zitat:
|
Re: DLL Funktionsaufruf
Hallo,
wie Neutrag General zeigt, ist es am einfachsten die Deklaration der Dll-Methode zu ändern.
Delphi-Quellcode:
Foo1 und Foo2 sind das praktisch gleiche, Foo1 ist aber einfacher zu handhaben,
type
TRec = record end; PRec = ^TRec; procedure Foo1(var Rec: TRec); procedure Foo2(PRec: TRec); weil du keinen Zeiger benutzen musst. Heiko |
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 00:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz