PDA

View Full Version : Result TString From Other Application



FirstLine
جمعه 20 آذر 1383, 12:49 عصر
با سلام
آیا این امکان وجود دارد که از داخل برنامه یک فایل exe و اجرایی دیگر را صدا زده و برنامه منتظر بماند تا این فایل جدید اجرا و پایان یابد پس از بستن برنامه ثانویه یک آرایه یا TString به برنامه اول برگردانده و پس از آن برنامه اصلی و اولیه با دریافت نتیجه (Tstring)به کار خود ادامه دهد؟
با تشکر

hps
جمعه 20 آذر 1383, 19:40 عصر
1. فکر کنم که مساله‌ات رو خیلى انتزاعى مطرح کردى. بهتره اون رو شفاف‌تر کنى.
2. امکان داره یه برنامه رو اجرا کنى و همینطور مى‌تونى بفهمى که برنامه در حال اجراست یا تموم شده، اما رد و بدل پیام بین دو تا برنامه یه ذره سخت‌تره. این بستگى به مساله داره.

FirstLine
شنبه 21 آذر 1383, 14:13 عصر
با سلام
با تشکر از راهنمایی شما، پس مسئله را خورد کنم
چجوری میتونم از داخل برنامه اصلی یک فایل exe را اجرا ومنتظر پایان اجرای این فایل اجرایی باشم و پس از پایان فعالیت برنامه exe دوم برنامه اصلی به کار خود ادامه دهد؟
با تشکر

hps
شنبه 21 آذر 1383, 15:46 عصر
براى اجراى یه برنامه (فایل EXE) از توى یه برنامه دیگه از تابع WinExec که مربوط به Windows API مى‌شه مى‌تونى استفاده کنى. راهنماى این تابع رو مى‌تونى تو Win32 Programmer's Refrence پیدا کنى، به علاوه فکر کنم یه همچین چیزى تو یکى از مباحث تو همین انجمن مطرح شده بود، مى‌تونى بگردى پیداش کنى.

اما منتظر موندن براى پایان برنامه:
یه راه حل خیلى آسون (اما نه خیلى تمیز) اینه که یه Timer توى برنامه‌اى که قراره منتظر بمونه بگذارى و دائما چک کنى که برنامه مورد نظرت در حال اجراست یا نه. مى‌تونى با این کار TimeOut هم بگذارى.
براى اینکه بدونى برنامه‌اى در حال اجراست یا نه از JclSysInfo.RunningProcessesList استفاده کن، چون اگه بخواى خودت با توابع API این کار رو انجام بدى خیلى مشکله.

مهدی کرامتی
شنبه 21 آذر 1383, 18:46 عصر
نگاهی به این تابع بیاندازید:

function WinExecAndWait32(FileName:String; Visibility : integer):integer;
var
zAppName:array[0..512] of char;
zCurDir:array[0..255] of char;
WorkDir:String;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
begin
StrPCopy(zAppName,FileName);
GetDir(0,WorkDir);
StrPCopy(zCurDir,WorkDir);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);

StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(nil,
zAppName, { pointer to command line string }
nil, { pointer to process security attributes }
nil, { pointer to thread security attributes }
false, { handle inheritance flag }
CREATE_NEW_CONSOLE or { creation flags }
NORMAL_PRIORITY_CLASS,
nil, { pointer to new environment block }
nil, { pointer to current directory name }
StartupInfo, { pointer to STARTUPINFO }
ProcessInfo) then Result := -1 { pointer to PROCESS_INF }

else begin
WaitforSingleObject(ProcessInfo.hProcess,INFINITE) ;
GetExitCodeProcess(ProcessInfo.hProcess,Result);
end;
end;

نحوه استفاده:

WinExecAndWait32('c:\myfile.exe',SW_NORMAL);


hps
یک شنبه 22 آذر 1383, 15:12 عصر
WinExecAndWait32

این یه راه حل تمیزه.

FirstLine
یک شنبه 22 آذر 1383, 17:05 عصر
با سلام
من این تابع را که به پروژه اضافه کردم از خط زیر ایراد میگیره؟!


GetExitCodeProcess(ProcessInfo.hProcess,Result);
با تشکر