PDA

View Full Version : جلوگيري از اجراي پروژه



mehdimdp
سه شنبه 12 خرداد 1388, 20:52 عصر
سلام
چطوري ميتونم قبل از اينكه هيچ فرمي به نمايش دربياد، (طبق يه شرطي) برنامه رو ببندم؟
من خودم توي رويداد oncrate فرم اصلي بعداز شرطم دستور زير رو نوشتم:


Application.Terminate;

اين دستور اجرا ميشه ولي كار نمي كنه . يعني فورا به خط بعدي ميره

Pr0grammer
سه شنبه 12 خرداد 1388, 21:12 عصر
از منوی project گزینه View Source رو انتخاب کنید؛
در صفحه باز شده، قبل از دستورات زیر می تونید شرط مورد نظرتونو قرار بدید :


شرط مورد نظر
Application.Initialize;
Application.CreateForm(TForm1, Form1);
.......
Application.Run;

mehdimdp
سه شنبه 12 خرداد 1388, 22:16 عصر
شرط من اينه :


if not(FileExists('sett.dll'))then
ShellExecute(Handle, 'open', PChar('selectproj.exe'), nil, nil, SW_SHOW);

من ميخوام اگه اين فايل نبود. يه برنامه ي ديگه اجرا بشه.(كه اون برنامه فايل مورد نظر رو ميسازه)
حالا بگيد چيكار كنم؟

mehdimdp
سه شنبه 12 خرداد 1388, 22:49 عصر
يعني اگه اين فايل نبود اجراي برنامه قطع بشه

as13851365
چهارشنبه 13 خرداد 1388, 10:16 صبح
خوب چرا باید برنامه رو ببندی ؟
در هنگام اجرای برنامه بررسی کن ببین فایل مزبور هست یا نه اگر وجود نداشت خوب با کدهای زیر برنامه دیگه ای رو که می گید اون فایل رو می سازه رو اجرا کنید تا اون فایل ساخته بشه بعد از تمام شدن کار برنامه ای که وظیفه ساخت فایل رو داره برنامه اصلی کارش رو ادامه می ده .



function ExecutePrg(const CmdLine: String; const Wait: boolean): boolean;
var
LastError: Integer;
ExitCode: Cardinal ;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
StartupInfo.wShowWindow := SW_SHOWNORMAL;
Result := CreateProcess(nil, // ptr to name of executable module
PChar(CmdLine), // ptr to command line string
nil, // ptr to process security attributes
nil, // ptr to thread security attributes
false, // handle inheritance flag
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, // creation flags
nil, // ptr to new environment block
nil, // ptr to current directory name
StartupInfo, // ptr to STARTUPINFO
ProcessInfo); // ptr to PROCESS_INFORMATION
if Result then
begin
if Wait then
begin
repeat
Application.ProcessMessages;
GetExitCodeProcess(ProcessInfo.hProcess, ExitCode);
until (ExitCode <> STILL_ACTIVE);
end;
end
else
begin
LastError := GetLastError;
MessageDlg(SysErrorMessage(LastError) +' (Error: ' +IntToStr(LastError) +')', mtError, [mbOK], 0);
end;
end;

//************************************* or *********************
Function ExecuteAndWait(sExecutableFile : String) : Boolean;
var
siInfo : TStartUpInfo;
piInfo : TProcessInformation;
begin
FillChar(siInfo, SizeOf(siInfo), #0);

with siInfo do begin
cb := SizeOf(siInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := SW_SHOWNORMAL;
end;
Result := CreateProcess(NIL, pChar(sExecutableFile), NIL, NIL, FALSE, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, NIL, pchar(ExtractFilePath(sExecutableFile)),siInfo, piInfo);
if Result then
WaitForSingleObject(piInfo.hprocess,INFINITE);
end;
//************************************* or *********************
var
PH : THandle;
begin
PH := Winexec('c:\Windows\Notpad.exe',SW_SHOWNORMAL);
while GetModuleUsage(PH) <> 0 Do
application.processmessage;
end;
//************************************* or *********************
uses ShellAPI;
...
function ExecAndWait(const ExecuteFile, ParamString : string): boolean;
var
SEInfo: TShellExecuteInfo;
ExitCode: DWORD;
begin
FillChar(SEInfo, SizeOf(SEInfo), 0);
SEInfo.cbSize := SizeOf(TShellExecuteInfo);
with SEInfo do
begin
fMask := SEE_MASK_NOCLOSEPROCESS;
Wnd := Application.Handle;
lpFile := PChar(ExecuteFile);
lpParameters := PChar(ParamString);
nShow := SW_HIDE;
end;
if ShellExecuteEx(@SEInfo) then
begin
repeat
Application.ProcessMessages;
GetExitCodeProcess(SEInfo.hProcess, ExitCode);
until (ExitCode <> STILL_ACTIVE) or
Application.Terminated;
Result:=True;
end
else Result:=False;
end;



شما دربرنامه X از کد های بالا استفاده کنید و با این کدها برنامه Y رو اجرا کنید برنامه X منتظر می مونه تا کار برنامه Y تمام بشه بعد از این که کار برنامه Y تمام شد برنامه X کارش رو ادامه می ده

mehdimdp
چهارشنبه 13 خرداد 1388, 11:16 صبح
به نظر شما تابع ExecAndWait رو كجا تعريف كنم ؟

mehdimdp
چهارشنبه 13 خرداد 1388, 11:36 صبح
يه نكته ي ديگه هم هست.
ممكنه به هردليلي ، برنامه ي دوم درست اجرا نشه
من ميخوام درصورت وجود داشتن يه فايل ديگه (مثل ext.dll) برنامه ي اصلي ازكار بيفته و ديگه به كارش ادامه نده


if not(FileExists('sett.dll'))then
proc.ExecAndWait('selectproj.exe','');
if FileExists('ext.dll')then
Application.Terminate

ولي بعد از Application.Terminate برنامه بازم اجرا ميشه