![]() |
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:
Ich weiß nicht Weiter.:oops:
Result := CreatePipe(ReadPipe, WritePipe, @SecurityAttr, 0);
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; |
AW: E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimme
Wie lauten denn die Deklarationen von ReadPipe und WritePipe?
|
AW: E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimme
Zitat:
|
AW: E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimme
Code:
Dann eher so:
BOOL CreatePipe(
[out] PHANDLE hReadPipe, [out] PHANDLE hWritePipe, [in, optional] LPSECURITY_ATTRIBUTES lpPipeAttributes, [in] DWORD nSize );
Delphi-Quellcode:
Result := CreatePipe(@ReadPipe, @WritePipe, @SecurityAttr, 0); |
AW: E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimme
BESTEN DANK! :thumb:
|
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:
Das deckt sich aber mit dem ursprünglichen Aufruf. Man müsste vielleicht mal die uses-Anweisungen sehen.
function CreatePipe(var hReadPipe, hWritePipe: THandle;
lpPipeAttributes: PSecurityAttributes; nSize: DWORD): BOOL; stdcall; |
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/........ |
AW: E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimme
Zitat:
|
AW: E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimme
Zitat:
|
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:
:angle:
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. Zitat:
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