(Gast)
n/a Beiträge
|
AW: CreateProcess wirft Kernelbase Error
2. Apr 2021, 16:31
Jo.
Zitat:
lpCommangLine
...
The Unicode version of this function, CreateProcessW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation.
ReadOnly ist er zwar nicht, da Variable, aber vielleicht zu klein?
PChar/PWideChar/PAnsiChar aus einem String/WideString/UnicodeString/AnsiString
is bei '' immer nicht "writeable" und auch nicht wenn es er aus einer Constante gibt. (OK, Stringkonstanten sind zwar nur "schreibgeschützte" Variablen, aber dennoch)
Zu klein nein BufferSize ist 38
Ich habe es jetzt mal so gemacht aber leider schmiert die Anwendung wieder ab mit EAccessViolation
Obwohl der Text jetzt korrekt zu lesen ist.
Callback( ReadPipe(StdIO), Input, Terminate, PI, UserData);
Delphi-Quellcode:
TIOPipe = record
hRead,
hWrite: DWORD;
end;
TStdIO = record
stdIn,
stdOut,
stdError: TIOPipe;
end;
Delphi-Quellcode:
Function ReadPipe(StdIo: TStdIO): string;
var
BufferSize: DWORD;
Buffer: array [0..255] of AnsiChar;
begin
if StdIO.stdOut.hRead <> INVALID_HANDLE_VALUE then
begin
BufferSize := 0;
// First, check the size of the current pipe buffer
PeekNamedPipe( StdIO.stdOut.hRead,
nil,
0,
nil,
@BufferSize,
nil);
// if there is data waiting, fetch it
if BufferSize > 0 then
begin
try
ZeroMemory(@Buffer, BufferSize + 1);
// Read all data from the pipe
ReadFile(StdIO.stdOut.hRead, Buffer, BufferSize, BufferSize, nil);
SetLength(Result, BufferSize);
CopyMemory(@Result, @Buffer, BufferSize);
finally
StrDispose(Buffer);
end;
end
else
Result := '';
end
else
Result := '';
end;
so läuft es durch aber der Text ist dann nicht zu lesen.
Delphi-Quellcode:
Function ReadPipe(StdIo: TStdIO): string;
var
BufferSize: DWORD;
Buffer: PChar;
begin
if StdIO.stdOut.hRead <> INVALID_HANDLE_VALUE then
begin
BufferSize := 0;
// First, check the size of the current pipe buffer
PeekNamedPipe( StdIO.stdOut.hRead,
nil,
0,
nil,
@BufferSize,
nil);
// if there is data waiting, fetch it
if BufferSize > 0 then
begin
// set the new length of the result and initialize it
Buffer := StrAlloc(BufferSize + 1);
try
ZeroMemory(Buffer, BufferSize + 1);
// Read all data from the pipe
ReadFile(StdIO.stdOut.hRead, Buffer^, BufferSize, BufferSize, nil);
SetLength(Result, BufferSize);
CopyMemory(PChar(Result), Buffer, BufferSize);
finally
StrDispose(Buffer);
end;
end
else
Result := '';
end
else
Result := '';
end;
Finde den Fehler nicht warum es mit einem Array of AnsiString abschmiert.
Zitat:
Warum leere "Security" anstatt NIL an die Funktion?
Ist nicht von mir.
Geändert von venice2 ( 2. Apr 2021 um 16:38 Uhr)
|