ShellExecute و WinExec هردو برای اجرای یک برنامه محتاج پسوند اونند.
نتیجه اینکه یه برنامه با پسوند غیر اجرایی رو نمیشه بکمک اینا اجراکرد.
حالا اگه مثلا بخواهیم یه برنامه رو که خودمون ری نیمش کردیم اجرا کنیم چه باید
بکنیم :?:
ShellExecute و WinExec هردو برای اجرای یک برنامه محتاج پسوند اونند.
نتیجه اینکه یه برنامه با پسوند غیر اجرایی رو نمیشه بکمک اینا اجراکرد.
حالا اگه مثلا بخواهیم یه برنامه رو که خودمون ری نیمش کردیم اجرا کنیم چه باید
بکنیم :?:
1- دوباره Rename کنین
2- اجرا کنین
3- سه باره Rename کنین
منظورتونو درست فهمیده بودم؟
البته اینم راهیه ولی در واقع باید راه بهتری هم وجود داشته باشه؟ :قهر:
هدف من از اینکار جلوگیری از اجرای تصادفی توسط کاربر بوده ولی اینجوری یکم ناجوره. :|
فکر کنم بشه یه کارایی کرد.
مثلا" تو همون فایل اجرایی که میخواین اجراش کنین ، آرگومانهای ورودی رو چک کنین ، ببینین اگر اونهایی که شما میخواین توش هست (نشانه ای برای اینکه برنامه شما اون رو فرا خوانده) ، اونوقت اجازه اجرا بدین. در غیر این صورت از برنامه خارج بشین.
موفق باشین
میگن جوینده یابندست.
البته راههای مختلف زیادی برای حل این مشکل وجود داره. چند تاش اینایی که گفته شد ولی من برای رفع حاجت نیومده بودم. :shock:
این سوال رو مطرح کردم که یه چیزی به علممون اضافه بشه و ببینم واقعا یعنی راهی برای برای اجرای یه فایل با پسوند غیر اجرایی وجود نداره؟(این واقعا یه سوال شده برام)
البته از جوابای بی توقع شما هم خیلی ممنونم. 8-)
راه چاره استفاده از تابع CreateProcess است!
این هم تابع برای این کار:
Function RunProcess(Const AppPath:String;MustWait:Boolean=False;AppP arams:String='';Visibility:Word=SW_SHOWNOR MAL):DWord;
Var
SI:TStartupInfo;
PI:TPROCessINFORMATION;
Proc:THandle;
zFileName:Array[0..Max_Path*2]of char;
zParams:Array[0..Max_Path]of char;
begin
FillChar(SI,SizeOf(SI),0);
SI.cb:=SizeOf(Si);
Si.wShowWindow:=Visibility;
If Not CreateProcess(strPCopy(zFilename,AppPath&# 41;,
StrPCopy(zParams,APpParams),
nil,nil,False,NORMAL_PRIORITY_CLASs ,nil,nil,SI,PI) then
Raise EXCeption.CreateFmt('Failed to execute program '+
apppath+'.Error Code %d',[GetlastError]);
Proc:=PI.hProcess;
CloseHandle(Pi.HThread);
If MustWait then
If WaitForSingleObject(Proc,infinite)<>Wai t_Failed then
GetExitCodeProcess(Proc,Result);
CloseHandle(Proc);
end;
آقا ایول. شاهکار کردی!
دستت درد نکنه!
:flower: :flower: :flower: