Newsgroup: it.comp.lang.delphi
Titolo: Problemi con la CreateProcess

Ciao,
ho scritto una funzione per lanciare applicativi esterni, ma ho notato che
su alcuni computer (non su tutti) mi dà un errore di pagina non valida!
Mentre se uso la WinExec non mi dà problemi... dove sbaglio???
Grazie Max
******************
function Crea_Processo(NomeFile: string): Boolean;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  pcDirectoryEseguibile: array[0..250] of Char;
begin
  Screen.Cursor := crHourGlass;
  StrPCopy(pcDirectoryEseguibile, NomeFile);
  GetStartupInfo(StartupInfo);
  Result := CreateProcess(Nil,
    pcDirectoryEseguibile,
    Nil, { pointer to process security attributes }
    Nil, { pointer to thread security attributes }
    false, { handle inheritance flag }
    0,
    Nil, { pointer to new environment block }
    Nil,
    StartupInfo, { pointer to STARTUPINFO }
    ProcessInfo);
Screen.Cursor := crDefault;
end;
******************************
L'errore :
il programma ha provocato un errore di pagina non valida nel
modulo KERNEL32.DLL in 0137:bff9a3c0.
Registri:
EAX=01a1fc2c CS=0137 EIP=bff9a3c0 EFLGS=00000246
EBX=8156c314 SS=013f ESP=01a1fc28 EBP=01a1fc7c
ECX=0000013f DS=013f ESI=00000001 FS=0daf
EDX=00000000 ES=013f EDI=8156c358 GS=0000
Byte all'indirizzo CS:EIP:
5e 8b e5 5d c2 10 00 64 a1 00 00 00 00 55 8b ec
Immagine dello stack:
00000001 c0000005 00000001 00000000 bff9a3c0 00000000 00000000 007afe2c
00436b14 00000057 0000000e 00000003 5f312998 00000000 5f312a3a 5f300000

 Mentre se uso la WinExec non mi dà problemi... dove sbaglio???
Ciao Max,
anch'io ho spesso nei miei programmi la necessità di eseguire applicativi
esterni.
In particolare spesso mi serve di bloccare il flusso di esecuzione del
chiamante fino a quando il chiamato non ha terminato l'elaborazione.
A questo scopo ho scaricato (non mi ricordo più da dove) del codice che usa
la funzione incriminata CreateProcess.
Personalmente non ho mai problemi, ti riporto il codice, magari ti aiuta a
capire qual'è il problema, interessante (anche per me!) sarebbe provarlo
così com'è sulle macchine che ti danno problemi.
Ciao
{ Avvia un programma ed aspetta la sua chiusura prima di procedere.
I parametri:
cProgram: contiene nome.estensione del programma da eseguire
          (come accennato può essere un bat ma anche un exe o un com).
          E' possibile per altro scrivere una cosa del tipo
          WinExecAndWait( 'miobat.bat par1 par2 par3', 0 )
          dove par1, par2, par3 sono i parametri che saranno elaborati dal
batch
          la funzione assume che il programma da eseguire si trovi nella
stessa
          directory dell'applicazione delphi infatti la prima riga della
          function cita
          cWorkDir := ExtractFilePath( Application.EXEName )
          ma nulla vieta di cambiare il tutto.
nVisibility:  è il modo di visualizzazione della finestra dos che viene
creata
              ma ho avuto alcuni problemi nella gestione del parametro e per
              il momento la funzione all'interno usa SW_SHOWDEFAULT fisso
              avrei potuto eliminare il parametro ma...
Il valore di ritorno è 0 se tutto è andato a buon fine qualsiasi altro
Intero se si è verioficato un errore}
function WinExecAndWait(cProgram: string; nVisibility: integer): integer;
var
  cWorkDir: string;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  cWorkDir:='';
  FillChar( StartupInfo, Sizeof( StartupInfo), #0);
  FillChar( ProcessInfo, Sizeof( ProcessInfo), #0);
  StartupInfo.lpReserved     := nil;
  StartupInfo.lpDesktop      := nil;
  StartupInfo.lpTitle        := PChar('DOS process');
  StartupInfo.dwX            := 1;
  StartupInfo.dwY            := 1;
  StartupInfo.dwXSize        := 600;
  StartupInfo.dwYSize        := 400;
  StartupInfo.dwXCountChars  := 80;
  StartupInfo.dwYCountChars  := 25;
  StartupInfo.dwFillAttribute:= 0;
  StartupInfo.cbReserved2    := 0;
  StartupInfo.lpReserved2    := nil;
  StartupInfo.hStdInput      := 0;
  StartupInfo.hStdOutput     := 0;
  StartupInfo.hStdError      := 0;
  StartupInfo.cb             := Sizeof( StartupInfo);    // Ampiezza in Byte
della struttura
  StartupInfo.wShowWindow    := SW_SHOWDEFAULT;          // nVisibility;
  StartupInfo.dwFlags        := STARTF_FORCEONFEEDBACK;
  if not CreateProcess(nil,
                       PChar(cWorkDir+cProgram),
                       nil,
                       nil,
                       false,
                       CREATE_NEW_CONSOLE or CREATE_DEFAULT_ERROR_MODE,
                       getEnvironmentStrings,
                       nil,
                       StartupInfo,
                       ProcessInfo) then
    Result:=-1
  else
    begin
      WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
      GetExitCodeProcess(ProcessInfo.hProcess,Result);
    end;
end;

     ProcessInfo);
Fammi sapere...
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply

   FillChar( StartupInfo, Sizeof( StartupInfo), #0);
Vabbè... era così per "ottimizzare" codice...
Ciao, Davide DG

Grazie... purtroppo il risultato non cambia... con la createProcess continua
a darmi errore...
bye Max

Ciao,
grazie per le risposte... penso di aver trovato la vera causa dei
problemi... si vedrà...
comunque ho seguito i vostri consigli per utilizzare la createprocess
grazie ancora...bye MAx