![]() |
Addresse eines var Parameters ermitteln
Hallo,
eine DLL von mir exportiert eine function mit einem UInt32 var Parameter. Jemand anderes ruft die aus einer anderen Sprache auf und scheint jetzt immer wieder Crashes in der DLL zu verursachen die ich nach momentanem Analysestand auf meinen Schreibzugriff auf den var Parameter zurückführe. Kann ich zum Zweck der weiteren Analyse die Speicheradresse dieses var Parameters bekommen, damit ich die loggen kann? Wie geht sowas? Grüße TurboMagic |
AW: Addresse eines var Parameters ermitteln
Delphi-Quellcode:
:angle:
@ParameterName
VAR und CONST[REF] zeigen ja direkt zur eigentlichen Variable. Zitat:
Andersrum kenn ich es, dass z.B. aus gewissenm C++-igem öfters mal doppelte Zeigerdereferenzierungen zum Wert nötig sind, denn die eigentliche Variable liegt ein einer VariablenObjektInstanz (dieser Nullableschrott) und als CONST-Parameter in der Funktion steht dann das Objekt, anstatt der Variable. (in der API-Doku steht klingt aber, dass dort der Wert stünde) Vielleicht macht hier jemand in der anderens Sprache auch sowas, nur halt andersrum. (du gibt Variable rein aber der behandelt die als Objekt) Aber hier würde ich eher erwarten, dass Jener dann nicht die Variable überschreibt, sondern etwas Anderes. (das worauf der Pointer(Variableninhalt) zeigt) |
AW: Addresse eines var Parameters ermitteln
Und wie ist das jetzt mit dem Ermitteln der Adresse Zwecks Anzeige?
|
AW: Addresse eines var Parameters ermitteln
Was ist denn da genau das Problem? Die Adresse einer Variable ist ein Pointer, den du z.B. über
Delphi-Quellcode:
in einen String umwandeln kannst.
Format('(%p)', [theVarPtr])
|
AW: Addresse eines var Parameters ermitteln
Hallo TurboMagic,
sollte der Aufruf Deiner DLL von VBA aus erfolgen, dann muß das erste Element als ByRef und mit dem passenden Variablen-Typ des Elements übermittelt werden. |
AW: Addresse eines var Parameters ermitteln
Hallo,
ist das die einzige Funktion, die Probleme bereitet? Vielleicht benutzt das andere Programm einfach nur die falsche Aufruf-Konvention? Wie sieht dein Exports aus und wie der Imports des fremden Programmes? In welcher Sprache ist es überhaupt? |
AW: Addresse eines var Parameters ermitteln
Zitat:
Einfach nur mit 64 Bit kompilieren. Da gibt es dann nur noch eine Konvention (die zufällig sehr pascallig aussieht). :duck: |
AW: Addresse eines var Parameters ermitteln
Hallo,
nix falsche Aufrufkonvention. Die Nutzer haben tatsächlich mit NULL aufgerufen. Mit der von Uwe angegebenen Format-String Ausgabe kann ich das bestimmt auch im Log nachweisen, aber es wurde jetzt auch drüber gesprochen diesen Parameter optional zu machen, was bedeutet, dass ich rausbekommen muss, ob der NULL ist. Mit Assigned geht es nicht. Es wäre evtl. die Option diese Formatstring Ausgabe abzuprüfen, da müsste ja für NULL dann '0x00000000' zurückkommen. Da es die DLL per4spektivisch auch in 64 bit geben wird müsste ich zusätzlich auch auf '0x0000000000000000' prüfen. Oder gibt's nicht doch eine bessere Alternative? Möglichst eine, bei der ich die Deklaration dieses Var-Parameters nicht abändern muss. Grüße TurboMagic |
AW: Addresse eines var Parameters ermitteln
Du kannst doch einfach einen Pointer daraus machen. Das ist im Hintergrund auch nichts anderes und so wird es in anderen Sprachen ja bei der Übersetzung ohnehin deklariert (weshalb dann dort auch null übergeben werden kann).
Wenn du die Adresse mit @ abfragst, sollte die aber auch nil sein. // EDIT:
Delphi-Quellcode:
procedure Test(var a: Int32);
begin ShowMessage(IntToHex(NativeUInt(@a), 8) + ' - ' + BoolToStr(Assigned(@a), True)); end; type PInt32 = ^Int32; procedure TestA(a: PInt32); asm call Test; end; procedure ExecTest; var b: Integer; begin b := 42; Test(b); TestA(@b); TestA(nil); end; |
AW: Addresse eines var Parameters ermitteln
Zitat:
Delphi-Quellcode:
function DeineFunktion(var AParameter: UInt32): TRückgabewert;
vernünftigerweise sowas:
Delphi-Quellcode:
function DeineFunktion(AParameter: PUInt32): TRückgabewert;
So kannst du in deiner Funktion prüfen:
Delphi-Quellcode:
EDIT: Siehe auch jaenickes Beitrag über meinen.
function DeineFunktion(AParameter: PUInt32): TRückgabewert;
begin if AParameter <> nil then begin // ... end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:56 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