Fórum createprocess - access violation 'kernel32.dll' #14322
20/01/2010
0
Boa Noite a todos!
Estou tentando usar o createprocess mas estou obtendo um access violation no 'kernel32.dll'.
Alguém já passou por isso e conseguiu resolver ?
Grato pelo ajuda
Estou tentando usar o createprocess mas estou obtendo um access violation no 'kernel32.dll'.
Alguém já passou por isso e conseguiu resolver ?
Grato pelo ajuda
_osw
Curtir tópico
+ 0
Responder
Posts
17/04/2011
Jáder Medeiros
Deve ser porque a string de sua IDE é tratada como unicode. A diretiva UNICODE revela essa informação.
Para corrigir o problema, trate sua string com o código abaixo:
Abaixo, uma função de exemplo para criar um processo com o CreateProcess:
Para corrigir o problema, trate sua string com o código abaixo:
{$IFDEF UNICODE}
if StringRefCount(vCommandLine) = -1 then begin
vCommandLine := Copy(vCommandLine, 1, MaxInt);
end;
{$ENDIF UNICODE}
Abaixo, uma função de exemplo para criar um processo com o CreateProcess:
function CreateProcessAndWait(const aCommandLine: string): string;
const
ReadBuffer = 1048576;
var
Security: TSecurityAttributes;
ReadPipe, WritePipe: THandle;
start: TStartUpInfo;
ProcessInfo: TProcessInformation;
Buffer: PAnsiChar;
TotalBytesRead, BytesRead: DWORD;
Apprunning, n, BytesLeftThisMessage, TotalBytesAvail: Integer;
vCommandLine: string;
begin
Security.nlength := SizeOf(TSecurityAttributes);
Security.binherithandle := True;
Security.lpsecuritydescriptor := nil;
if CreatePipe (ReadPipe, WritePipe, @Security, 0) then begin
Buffer := AllocMem(ReadBuffer + 1);
FillChar(Start, Sizeof(Start), #0);
start.cb := SizeOf(start);
start.hStdOutput := WritePipe;
start.hStdInput := ReadPipe;
start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
start.wShowWindow := SW_HIDE;
vCommandLine := aCommandLine;
{$IFDEF UNICODE}
if StringRefCount(vCommandLine) = -1 then begin
vCommandLine := Copy(vCommandLine, 1, MaxInt);
end;
{$ENDIF UNICODE}
if CreateProcess(nil, PWideChar(vCommandLine), @Security, @Security, True, CREATE_NO_WINDOW or NORMAL_PRIORITY_CLASS, nil, nil, start, ProcessInfo) then begin
n := 0;
TotalBytesRead := 0;
repeat
Inc(n, 1);
Apprunning := WaitForSingleObject(ProcessInfo.hProcess,100);
Application.ProcessMessages;
if not PeekNamedPipe(ReadPipe, @Buffer[TotalBytesRead], ReadBuffer, @BytesRead, @TotalBytesAvail, @BytesLeftThisMessage) then begin
Break;
end
else if BytesRead > 0 then begin
ReadFile(ReadPipe, Buffer[TotalBytesRead], BytesRead, BytesRead, nil);
end;
TotalBytesRead := TotalBytesRead + BytesRead;
until (Apprunning WAIT_TIMEOUT) or (n > 150);
Buffer[TotalBytesRead] := #0;
OemToChar(PAnsiChar(Buffer), PWideChar(string(Buffer)));
Result := Result + PChar(string(Buffer));
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;
end;
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)