AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen
Thema durchsuchen
Ansicht
Themen-Optionen

E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen

Ein Thema von wschrabi · begonnen am 6. Feb 2025 · letzter Beitrag vom 6. Feb 2025
Antwort Antwort
wschrabi

Registriert seit: 16. Jan 2005
450 Beiträge
 
#1

E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen

  Alt Gestern, 10:22
Hallo,
Ich Bekomme

[dcc64 Fehler] MainUnitv2k.pas(25328): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen

  Result := CreatePipe(ReadPipe, WritePipe, @SecurityAttr, 0); Ich weiß nicht Weiter.
Hier mein Code.
Wäre um jede HIlfe Dankbar.
WS


Delphi-Quellcode:
function CreateInheritablePipe(var ReadPipe, WritePipe: THandle): Boolean;
var
  SecurityAttr: TSecurityAttributes;
begin
  FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0);
  SecurityAttr.nLength := SizeOf(TSecurityAttributes);
  SecurityAttr.bInheritHandle := True;
  SecurityAttr.lpSecurityDescriptor := nil;

  Result := CreatePipe(ReadPipe, WritePipe, @SecurityAttr, 0);
end;

function Tform1.fnExecuteWSLCommand(const Command: string): string;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  SecurityAttr: TSecurityAttributes;
  myReadPipe, myWritePipe: THandle;
  Buffer: array[0..255] of AnsiChar;
  BytesRead: DWORD;
  Output: TStringList;
begin
  Result := '';
  FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
  FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);
  FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0);

   SecurityAttr.nLength := SizeOf(TSecurityAttributes);
   SecurityAttr.bInheritHandle := True;
   SecurityAttr.lpSecurityDescriptor := nil;

  (*
  SecurityAttr.nLength := SizeOf(TSecurityAttributes);
  SecurityAttr.bInheritHandle := True;
  *)

  // Create pipes for capturing output
   if not CreateInheritablePipe(myReadPipe, myWritePipe) then
        RaiseLastOSError;

  try
    StartupInfo.cb := SizeOf(TStartupInfo);
    StartupInfo.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
    StartupInfo.hStdOutput := MyWritePipe;
    StartupInfo.hStdError := MyWritePipe;
    StartupInfo.wShowWindow := SW_HIDE;

    // Prepare the WSL command
    if not CreateProcess(
      nil,
      PChar('C:\Windows\System32\wsl.exe ' + Command),
      nil,
      nil,
      True,
      CREATE_NO_WINDOW,
      nil,
      nil,
      StartupInfo,
      ProcessInfo) then
    begin
      RaiseLastOSError;
    end;

    CloseHandle(MyWritePipe); // Close the write end of the pipe

    Output := TStringList.Create;
    try
      repeat
        BytesRead := 0;
        if ReadFile(MyReadPipe, Buffer, SizeOf(Buffer) - 1, BytesRead, nil) and (BytesRead > 0) then
        begin
          Buffer[BytesRead] := #0; // Null-terminate the buffer
          Output.Add(string(Buffer));
        end;
      until BytesRead = 0;

      Result := Output.Text; // Combine all output lines into a single string
    finally
      Output.Free;
    end;

    // Wait for the process to finish and clean up
    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    
  finally
    CloseHandle(MyReadPipe); // Close the read end of the pipe
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.555 Beiträge
 
Delphi 12 Athens
 
#2

AW: E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimme

  Alt Gestern, 10:40
Wie lauten denn die Deklarationen von ReadPipe und WritePipe?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.650 Beiträge
 
Delphi 12 Athens
 
#3

AW: E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimme

  Alt Gestern, 10:42
Zitat:
 myReadPipe, myWritePipe: THandle;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.485 Beiträge
 
Delphi 12 Athens
 
#4

AW: E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimme

  Alt Gestern, 10:45
Code:
BOOL CreatePipe(
  [out]         PHANDLE              hReadPipe,
  [out]         PHANDLE              hWritePipe,
  [in, optional] LPSECURITY_ATTRIBUTES lpPipeAttributes,
  [in]          DWORD                nSize
);
Dann eher so:
Delphi-Quellcode:
  
  Result := CreatePipe(@ReadPipe, @WritePipe, @SecurityAttr, 0);
  Mit Zitat antworten Zitat
wschrabi

Registriert seit: 16. Jan 2005
450 Beiträge
 
#5

AW: E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimme

  Alt Gestern, 10:55
BESTEN DANK!
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.555 Beiträge
 
Delphi 12 Athens
 
#6

AW: E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimme

  Alt Gestern, 11:01
Also die Deklaration in Winapi.Windows sieht eher so aus:
Delphi-Quellcode:
function CreatePipe(var hReadPipe, hWritePipe: THandle;
  lpPipeAttributes: PSecurityAttributes; nSize: DWORD): BOOL; stdcall;
Das deckt sich aber mit dem ursprünglichen Aufruf. Man müsste vielleicht mal die uses-Anweisungen sehen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimme

  Alt Gestern, 11:07
Wird WinMD verwendet?

Dort haben viele APIs eine andere/inkompatible Signatur,
bzw. Einige sehen "gleich" aus, aber die Typen sind anders oder gar komplett falsch/schrott/imarsch/beschissen/totalermist/schwachsinnig/hirnrissig/........
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

AW: E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimme

  Alt Gestern, 11:35
Also die Deklaration in Winapi.Windows sieht eher so aus:
Das hat Embarcadero aber bei vielen Aufrufen von Pointer auf var geändert. Der Dank sieht für mich danach aus, dass es funktioniert, vermutlich mit einer älteren Delphi-Version.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.555 Beiträge
 
Delphi 12 Athens
 
#9

AW: E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimme

  Alt Gestern, 11:45
vermutlich mit einer älteren Delphi-Version.
Das wäre in der Tat eine relevante Information gewesen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimme

  Alt Gestern, 12:11
Delphi-Quellcode:
begin
  var SecurityAttr := Default(TSecurityAttributes); // inkl. sowas wie FillChar mit 0
  SecurityAttr.nLength := SizeOf(TSecurityAttributes);
  SecurityAttr.bInheritHandle := True;
  //SecurityAttr.lpSecurityDescriptor := nil; // 0 bleibt ja 0
  Result := CreatePipe(ReadPipe, WritePipe, @SecurityAttr, 0);
end;
Delphi-Quellcode:
var
  SecurityAttr: TSecurityAttributes;
begin
  SecurityAttr := Default(TSecurityAttributes); // inkl. sowas wie FillChar mit 0
  ...



Der Unterschied kann auch beim SecurityAttr sein, wie z.B. typloser Zeiger, typisierter Zeiger oder Const/Var/...
Also einfach mal die Deklaration von "deinem" verwendeten CreatePipe suchen und die Signatur (Typen der Parameter) ansehn,
sowie bei dir und der Deklaration prüfen, ob sie auf die "selben" Typ-Deklarationen der Parameter verweisen.

Also die Deklaration in Winapi.Windows sieht eher so aus:
Das ist auch der Grund, warum z.B. zusammen mit Embas WinMD es gern raucht, da sich gern das mit Pointer vs. Const/Var unterscheidet. (für Pflichparameter, finde ich die Variante mit Const/Var handlicher)
Teilweise ist es im WinMD auch besser, weil Delphi teilweise hart CONST/VAR nutzt, auch für optionale Parameter, welche durch sowas zur Pflicht werden (außer man castet böse mit NIL um sich)
$2B or not $2B

Geändert von himitsu (Gestern um 12:27 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 16:46 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 by Thomas Breitkreuz