Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DLL Funktions Aufruf führt zu access violation in eigener procedure (https://www.delphipraxis.net/192581-dll-funktions-aufruf-fuehrt-zu-access-violation-eigener-procedure.html)

stalkingwolf 2. Mai 2017 14:44

DLL Funktions Aufruf führt zu access violation in eigener procedure
 
2 Probleme habe ich aktuell die nicht nicht ganz verstehe.

Wir setzen eine DLL von A-Trust ein zum auslesen einer Smartcard auf einem USB Stick.
Das ganze funktioniert eigentlich einwandfrei, wenn ich mein Programm als DEBUG Build laufen lassen.
Schalte ich auf RELEASE um, dann führen einige DLL Funktionsaufrufe zu einer Access Violation wenn meine procedure in Delphi beendet wird, welche die DLL Funktion aufruft.

Dann habe ich mit einer DLL Funktion das Problem das sie in Formclose ohne Fehler und in einer Procedure mit Fehler am Ende der Procedure aufgerufen wird.

z.b diese Funktion :
Code:
long Finalize(void* ptr);
Code:
function Finalize(ptr:integer):long; stdcall; external 'asignRKCom.dll';
// Funktioniert
Code:
procedure Tfmain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    Finalize(h);
end;
// Ergibt einen Fehler
Code:
procedure Tfmain.myFinalize;
var erg:integer;
begin
    erg:=Finalize(h); // Erg = 0;
end; // <---- Fehler

procedure Tfmain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    myFinalize;
end;
Ich weiß nicht ob es ein Fehler meiner Deklaration ist oder Delphi ein Problem hat.
Oder es am Namen Finalize liegt.


Edit :
ich habe das ganze einmal anders Deklariert
Code:
function _Finalize(ptr:integer):long; stdcall; external 'asignRKCom.dll' name 'Finalize';
Das brachte auch nichts.

Aviator 2. Mai 2017 14:52

AW: DLL Funktions Aufruf führt zu access violation in eigener procedure
 
Zitat:

Zitat von stalkingwolf (Beitrag 1369846)
Ich weiß nicht ob es ein Fehler meiner Deklaration ist oder Delphi ein Problem hat.
Oder es am Namen Finalize liegt.

Ich kann dir zwar jetzt nicht genau sagen wo dein Fehler liegt, aber die Funktion Finalize gibt es bei Delphi schon. Da deine Funktion wahrscheinlich im Kontext früher kommt als die aus den System Units, wird wohl deine verwendet.

Aber den Namen kannst du ja ganz einfach mal ändern indem du bei der Deklaration der Funktion den Namen auf FinalizeDLL oder so änderst und den Namen der entsprechenden DLL-Funktion mit übergibst.

Delphi-Quellcode:
function FinalizeDLL(ptr:integer):long; stdcall; external 'asignRKCom.dll' name 'Finalize';
Somit solltest du zumindest diese Unklarheit beseitigen können.

himitsu 2. Mai 2017 14:57

AW: DLL Funktions Aufruf führt zu access violation in eigener procedure
 
Ich würde auch mal bei der Convention suchen.
cdecl?

PS:
Delphi-Quellcode:
function FinalizeDLL(ptr: Pointer{oder THandle}): LongInt; stdcall; external 'asignRKCom.dll' name 'Finalize';

stalkingwolf 2. Mai 2017 15:04

AW: DLL Funktions Aufruf führt zu access violation in eigener procedure
 
Danke euch 2. Auf die Idee kam ich dann auch als ich es gepostet hatte.
Brachte leider nichts.

stalkingwolf 2. Mai 2017 15:07

AW: DLL Funktions Aufruf führt zu access violation in eigener procedure
 
Zitat:

Zitat von himitsu (Beitrag 1369853)
Ich würde auch mal bei der Convention suchen.
cdecl?

Das geht. Jetzt muss ich mich mal reinlesen was der Unterschied ist :-)

himitsu 2. Mai 2017 15:12

AW: DLL Funktions Aufruf führt zu access violation in eigener procedure
 
http://docwiki.embarcadero.com/RADSt...ufkonventionen
https://de.wikipedia.org/wiki/Aufrufkonvention -> siehe stdcall "Anders als bei"

Delphi nutzt übrigens fastcall/register und nicht pascal (unter x86) und in x64 nutzen Alle ein die CPU-Register wie in fastcall/register, nur das Aufräumen und der Stack wie bei C.
quasi FastCall+CDecl :stupid:

hoika 2. Mai 2017 15:55

AW: DLL Funktions Aufruf führt zu access violation in eigener procedure
 
Hallo,
der Unterschied ist, wer den Stack der aufrufenden Funktion aufräumt.
Macht man hier einen Konfigurationsfehler,
wird der Stack 2mal aufgeräumt -> Puff.

himitsu 2. Mai 2017 15:56

AW: DLL Funktions Aufruf führt zu access violation in eigener procedure
 
Oder keiner räumt auf -> Puff

Jetzt haben wir zwei mal den Michael gerufen ... mal sehn wann er kommt.


Ob stdcall, cdecl oder sonstwas, das definiert der Quellcode für diese DLL, bzw. das Standardverhalten des verwendeten Compilers.

TiGü 2. Mai 2017 16:20

AW: DLL Funktions Aufruf führt zu access violation in eigener procedure
 
Ist sicher hilfreich für die anderen, wenn du mal die Doku dazu verlinken würdest:
http://labs.a-trust.at/developer/pdf...erkasseCOM.pdf

Seid ihr nicht etwas spät dran mit eurer Entwicklung? Ist schließlich schon der 2. Mai.

stalkingwolf 2. Mai 2017 16:38

AW: DLL Funktions Aufruf führt zu access violation in eigener procedure
 
Das Ding ist fertig, aber das waren Sachen die ich noch ändern wollte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:21 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