Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen (https://www.delphipraxis.net/216658-e2033-die-typen-der-tatsaechlichen-und-formalen-var-parameter-muessen-uebereinstimmen.html)

wschrabi 6. Feb 2025 10:22

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

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

Delphi-Quellcode:
  Result := CreatePipe(ReadPipe, WritePipe, @SecurityAttr, 0);
Ich weiß nicht Weiter.:oops:
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;

Uwe Raabe 6. Feb 2025 10:40

AW: E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimme
 
Wie lauten denn die Deklarationen von ReadPipe und WritePipe?

DeddyH 6. Feb 2025 10:42

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

Delphi-Quellcode:
 myReadPipe, myWritePipe: THandle;

;-)

Blup 6. Feb 2025 10:45

AW: E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimme
 
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);

wschrabi 6. Feb 2025 10:55

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

Uwe Raabe 6. Feb 2025 11:01

AW: E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimme
 
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.

himitsu 6. Feb 2025 11:07

AW: E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimme
 
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/........

jaenicke 6. Feb 2025 11:35

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

Zitat von Uwe Raabe (Beitrag 1545966)
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.

Uwe Raabe 6. Feb 2025 11:45

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

Zitat von jaenicke (Beitrag 1545969)
vermutlich mit einer älteren Delphi-Version.

Das wäre in der Tat eine relevante Information gewesen.

himitsu 6. Feb 2025 12:11

AW: E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimme
 
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
  ...
:angle:


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.

Zitat:

Zitat von Uwe Raabe (Beitrag 1545966)
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)


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