Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Methode löst AV aus, wenn über Interface aufgerufen (https://www.delphipraxis.net/144993-methode-loest-av-aus-wenn-ueber-interface-aufgerufen.html)

implementation 21. Dez 2009 17:57


Methode löst AV aus, wenn über Interface aufgerufen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe hier ein Interface (IGenetix) und dessen zugehörige Klasse (TGenetix).
Wenn ich eine Methode über eine Variable der Klasse direkt aufrufe, gibt es keine Probleme.
Wenn ich die Methode dann aber über ein Interface aufrufe, wird eine Access Violation ausgelöst.
Der Code für die DLL ist angehängt.
Es wird erst einmal nur GetGenetix() aufgerufen.

xaromz 21. Dez 2009 18:14

Re: Methode löst AV aus, wenn über Interface aufgerufen
 
Hallo,

ändere doch mal die lokale Variable in GetGenetix (gen) zum Typ IGenetix. Ich vermute, irgendwo stimmt die Referenzzählung sonst nicht.
Falls das nichts hilft, dann gehe mit Einzelschritt durch GetByte(), um den Fehler einzugrenzen.

Gruß
xaromz

hoika 21. Dez 2009 19:21

Re: Methode löst AV aus, wenn über Interface aufgerufen
 
Hallo,

noch mal dein Code

Delphi-Quellcode:
Gen.Assign(PChar(local)); // läuft
WriteLn(Gen.GetByte('@')); // läuft
Result := Gen;
WriteLn(Result.GetByte('@')); // läuft nicht (AV)
Wie sieht es damit aus ?

Delphi-Quellcode:
var
  IGen: IGenetix;
begin
 ...
  iGen:= Gen;
  WriteLn(iGen.GetByte('@')); // ???
  Result:= Gen;
end;

Heiko

implementation 22. Dez 2009 12:32

Re: Methode löst AV aus, wenn über Interface aufgerufen
 
Zitat:

Zitat von xaromz
ändere doch mal die lokale Variable in GetGenetix (gen) zum Typ IGenetix. Ich vermute, irgendwo stimmt die Referenzzählung sonst nicht.

Habe ich schon probiert. Hilft nicht.
Zitat:

Zitat von xaromz
Falls das nichts hilft, dann gehe mit Einzelschritt durch GetByte(), um den Fehler einzugrenzen.

Wenn ich die Methode direkt über die Klasseninstanz aufrufe, funzt sie ja.
Es ist auch egal, welche Methode. Auch IGenetix.Assign funzt nicht TGenetix.Assign aber schon.

[ADD]

OK ich habe das Problem jetzt gelöst.
Unverständlicherweise funktioniert es nicht mit CDECL.
Mit REGISTER und PASCAL gibt es keine Probleme.
Danke, dass ihr euch den Code angeschaut habt.


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