AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Dll-Methodenparameter von var nach const ändern
Thema durchsuchen
Ansicht
Themen-Optionen

Dll-Methodenparameter von var nach const ändern

Ein Thema von Der schöne Günther · begonnen am 20. Jan 2017 · letzter Beitrag vom 20. Jan 2017
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Dll-Methodenparameter von var nach const ändern

  Alt 20. Jan 2017, 10:20
Eine ganz dumme Frage, ich bin in Sachen DLL-Interop nicht so fit.

Ich habe eine Methode
Delphi-Quellcode:
procedure stuff(
   var   a:   Integer;
   var   b:   Integer;
   var   c:   Integer
); stdcall;
Kann ich sie (Parameter "b") gefahrlos ändern in

Delphi-Quellcode:
procedure stuff(
   var   a:   Integer;
   const   b:   Integer;
   var   c:   Integer
); stdcall;

Und alles bleibt untereinander kompatibel?
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#2

AW: Dll-Methodenparameter von var nach const ändern

  Alt 20. Jan 2017, 10:38
Kann ich sie (Parameter "b") gefahrlos ändern in
Ich denke eher nicht, als var-Parameter wird die Adresse der Variable übergeben, als const der eigentliche Wert - zumindest für Integer Variablen sollte es gerade so sein Aber Du kannst es ja mal testen

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Dll-Methodenparameter von var nach const ändern

  Alt 20. Jan 2017, 10:48
Also so wie ich es verstehe wird bei const der Parameter entweder per Referenz oder per Wert übergeben (siehe StackOverflow)

Mir geht es darum dass eine Routine einen var-Parameter hat, aber es unerwünscht ist dass dieser verändert wird. Um in Zukunft zu verhindern dass die implementierende Delphi-DLL den Wert eines Tages anfassen wird soll der Parameter von var in const geändert werden.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Dll-Methodenparameter von var nach const ändern

  Alt 20. Jan 2017, 10:54
Das kannst du doch leicht testen. Einfach eine Methode so, die andere so und dann sieht das Ergebnis so aus:
Delphi-Quellcode:
procedure stuffA(var a: Integer); stdcall;
procedure stuffB(const a: Integer); stdcall;

Unit155.pas.40: stuffA(a);
005C9AF3 8D45F8 lea eax,[ebp-$08]
005C9AF6 50 push eax
005C9AF7 E8D4FFFFFF call stuffA
Unit155.pas.41: stuffB(a);
005C9AFC 8B45F8 mov eax,[ebp-$08]
005C9AFF 50 push eax
005C9B00 E8D3FFFFFF call stuffB
Sprich bei var wird die Adresse übergeben (lea - load effective address), bei const der Wert (mov - Wert herüberschieben).
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Dll-Methodenparameter von var nach const ändern

  Alt 20. Jan 2017, 11:02
Hallo,

Zitat:
Um in Zukunft zu verhindern dass die implementierende Delphi-DLL den Wert eines Tages anfassen wird soll der Parameter von var in const geändert werden.
Wer implementiert denn die DLL?
Wenn das Methoden-Interface nicht mehr geändert werden kann,
dann rette einfach den Wert vor dem DLL-Aufruf und schreibe ihn danach wieder zurück.
Heiko
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Dll-Methodenparameter von var nach const ändern

  Alt 20. Jan 2017, 11:07
Ok danke, mit Assembler kenne ich mich kein Stück aus. Das bedeutet also nein.

Ich verstehe das mit dem Assembler aber noch nicht, wenn ich jetzt z.B. einmal gerne dasd [Ref] testen würde.

Folgender Code
Delphi-Quellcode:
program Project16;

{$APPTYPE CONSOLE}

{$R *.res}

uses System.SysUtils;

var
   a,b,c: Integer;

procedure stuffA(
   var a: Integer;
   var b: Integer;
   var c: Integer
 ); stdcall;
 begin
    asm nop end;
 end;

 procedure stuffB(
   var a: Integer;
   const [Ref] b: Integer;
   var c: Integer
 ); stdcall;
 begin
    // b := 42; // VERBOTEN
    asm nop end;
 end;

begin
   a := 10;
   b := 20;
   c := 30;

   stuffA(a,b,c);
   stuffB(a,b,c);
end.
ergibt folgende Assembly:
Code:
Project16.dpr.31: begin
004194E8 55               push ebp
004194E9 8BEC            mov ebp,esp
004194EB 83C4F0           add esp,-$10
004194EE A164B64100       mov eax,[$0041b664]
004194F3 C60001           mov byte ptr [eax],$01
004194F6 B8806E4100       mov eax,$00416e80
004194FB E89CF6FEFF      call @InitExe
Project16.dpr.32: a := 10;
00419500 C705C80E42000A000000 mov [$00420ec8],$0000000a
Project16.dpr.33: b := 20;
0041950A C705CC0E420014000000 mov [$00420ecc],$00000014
Project16.dpr.34: c := 30;
00419514 C705D00E42001E000000 mov [$00420ed0],$0000001e
Project16.dpr.36: stuffA(a,b,c);
0041951E 68D00E4200       push $00420ed0
00419523 68CC0E4200       push $00420ecc
00419528 68C80E4200       push $00420ec8
0041952D E83AD9FFFF      call stuffA
Project16.dpr.37: stuffB(a,b,c);
00419532 68D00E4200       push $00420ed0
00419537 68CC0E4200       push $00420ecc
0041953C 68C80E4200       push $00420ec8
00419541 E82ED9FFFF      call stuffB
Project16.dpr.38: end.
00419546 E831C7FEFF      call @Halt0
Das bedeutet nun dass man "const [Ref]" als Ersatz für "var" nehmen könnte?
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Dll-Methodenparameter von var nach const ändern

  Alt 20. Jan 2017, 11:09
Zitat:
Das bedeutet nun dass man "const [Ref]" als Ersatz für "var" nehmen könnte?
Ja genau dafür ist [REF] gedacht.
Fritz Westermann
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: Dll-Methodenparameter von var nach const ändern

  Alt 20. Jan 2017, 11:15
Selbst wenn der Integer als CONST-Referenz übergeben würde, kann man den Wert dennoch ändern, denn den Pointer hat man dann und ignoriert einfach das CONST.

VAR und OUT sind immer Referenzen.
CONST sagt nur dem Compiler, dass es nicht verändert werden soll, aber nichts darüber, ob als Referenz oder Wert.
CONST und IN/OHNE arbeiten also gleich und bei CONST wird nur eine Compilerprüfung aktiviert, welche man böswillig umgehen könnte.

Bei IN/OHNE ist endweder nur der lokale Wert änderbar, oder es wird ein COPY bei Prozedureintritt, bzw. später als Copy-On-Write implementiert.

Achtung, wenn ein älterer Compiler das [Ref] noch nicht kennt, aber Attribute schon implementiert sind, dann ignoriert er das einfach und gibt nichtmal eine Warnung raus.
Genauso wie bei [Weak] und [Unsave].
$2B or not $2B

Geändert von himitsu (20. Jan 2017 um 11:18 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:19 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