سؤال

أنا أستخدم Shellexecute لتشغيل التطبيق الخارجي كيف يمكنني معرفة متى ينتهي التطبيق الخارجي؟

هنا الكود الخاص بي

theProgram     :=  'MySql.exe';
itsParameters  :=  ' -u user1 -ppassword -e "create database abc"’;
rslt := ShellExecute(0, 'open',
                       pChar (theProgram),
                       pChar (itsParameters),
                       nil,
                       SW_SHOW);
هل كانت مفيدة؟

المحلول

جرب الوظيفة التالية. waitforsingleObject يفعل ما تحتاجه.

function ExecAppAndWait(const sApp, sParams: String; wShow: Word; sCurrentDirectory: String = ''): DWord;
{ Parameter wShow: SW_HIDE, SW_SHOWNORMAL, SW_NORMAL, SW_MAXIMIZE ...}
var
  aSI     : TStartupInfo;        // Win32 : STARTUPINFO
  aPI     : TProcessInformation; // Win32 : PROCESS_INFORMATION
  aProc   : THandle;             // Win32
  aCurrentDirectory: PChar;
  s: String;
begin
  s := sApp + ' ' + sParams;
  FillChar(aSI, SizeOf(aSI), 0);
  aSI.cb := SizeOf(aSI);
  aSI.wShowWindow := wShow;
  aSi.dwFlags := STARTF_USESHOWWINDOW;


  if sCurrentDirectory = '' then
    aCurrentDirectory := nil
  else
    aCurrentDirectory := PChar(sCurrentDirectory);

  Win32Check(CreateProcess(nil, PChar(s), nil, nil,
             False, Normal_Priority_Class, nil, aCurrentDirectory, aSI, aPI));
   // in TProcessInformation.hProcess -> Process-Handle
  aProc := aPI.hProcess;

  CloseHandle(aPI.hThread);


  if WaitForSingleObject(aProc, Infinite) <> Wait_Failed then
    GetExitCodeProcess(aProc, Result);
  // free Ressource
  CloseHandle(aProc);
end;

نصائح أخرى

Shellexecute هي وظيفة winapi مباشرة. للحصول على أي معلومات عن العملية المنفذة ، تحتاج إلى استخدام Shellexecuteex في حين أن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top