PDA

View Full Version : باز کردن فایل طبق پسوندهای رجیستر شده



_alish_
چهارشنبه 04 اردیبهشت 1387, 15:18 عصر
با سلام و احترام خدمت دوستان گرامی
یک جدول بانکم هر نوع فایلی در آن پیوست شده که با زدن کلید نمایش ، فایل از بانک در مسیری ذخیره و طبق برنامه اجرایی ویندوز باز گردد، نکته اینجاست که می خواهم پس از بستن برنامه ام کل برنامه های باز از طریق برنامه ام بسته شوند.
برای باز کردن exe ها قبلا با این کد عمل می کردم


var
PrcsCount : Integer;
Prcs : array[1..200] of TProcessInformation;

procedure CM_OpenProgram(prog, params: string);
var
PrcInfo: TStartupInfo;
CmdLine: string;
begin
PrcsCount:=PrcsCount+1;
CmdLine := '"' + prog + '"' + Params;
FillChar(PrcInfo, SizeOf(PrcInfo), #0);
with PrcInfo do
begin
cb := SizeOf(PrcInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := SW_NORMAL;
end;
CreateProcess(PChar('CMD '), PChar(CmdLine), nil, nil, False,
CREATE_NEW_CONSOLE or
NORMAL_PRIORITY_CLASS, nil,
PChar(ExtractFilePath(Prog)),
PrcInfo, Prcs[PrcsCount]);
// RUN -> OpenProgram(PathExe+(Sender as TSpeedButton).Hint,' TDR '+User.UserName+' '+ User.Pass);
end;


و برای بستن برنامه ها


procedure CM_ClosePrograms();
var
I : Integer;
R : Cardinal;
begin
for I:=1 to PrcsCount do
begin
GetExitCodeProcess(Prcs[i].hProcess,R);
if R=STILL_ACTIVE then
begin
TerminateProcess(Prcs[i].hProcess,1);
CloseHandle(Prcs[i].hProcess);
end;
end;
end;


حالا چطوری من مثلا فایل Word Excel تصویر را باز و با بستن برنامه کاملا ببندم؟

B-Vedadian
چهارشنبه 04 اردیبهشت 1387, 17:20 عصر
از ShellExecuteEx استفاده کنید. فیلد fMask رو حتما با SEE_MASK_NOCLOSEPROCESS اور (or) کنید. در نهایت هندل پروسه رو هم از فیلد hProcess بگیرید.

با این تابع هر فایل با برنامه نسبت داده شده بهش باز میشه.:چشمک:

_alish_
شنبه 07 اردیبهشت 1387, 11:55 صبح
متشکرم دوست عزیز ولی متاسفانه نتونستم یه فایل ورد را باز کنم و مهمتر از اون اینکه چطور در آرایه TProcessInformation برنامه باز را جهت بستن قرار دهم.
لطفا با یه سورس راهنمایی نمایید متشکر میشم.

B-Vedadian
شنبه 07 اردیبهشت 1387, 12:27 عصر
اگه خودتون بیشتر تلاش میکردید بهتر بود ولی این یک پروژه آماده است:
روی فرم دبل کلیک کنید، دیالوگ واسه انتخاب فایل میآد، Run رو بزنید عمل open رو برای فایل مورد نظر انجام میده، اگه بلافاصله بعد اون Kill... رو بزنید میبنددش.

_alish_
شنبه 07 اردیبهشت 1387, 13:13 عصر
متشکرم دوست ارجمند
اشتباه لوپی بنده زمان شما هم گرفت ، کد مربوطه بنده که نوشته بودم متاسفانه اسم فایلو اشتباه وارد می کردم و باز نمی شد.
باز کمال تشکر را بخاطر زحمت و وقتون دارم
کد کامل شده بنده برای دیگر دوستان با CreateProcess


procedure CM_OpenProgram(prog, params: string);
var
SUInfo : TStartupInfo;
CmdLine : string;
AppName : array[0..250] of char;
pR : Boolean;
begin
PrcsCount:=PrcsCount+1;
CmdLine := '"' + prog + '"' + Params;
//پیدا کردن فایل اجرایی پسوند مربوطه از ویندوز
FindExecutable(Pchar(Prog),nil,(AppName));
FillChar(SUInfo, SizeOf(SUInfo), #0);
with SUInfo do
begin
cb := SizeOf(SUInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := SW_NORMAL;
end;
pR:=CreateProcess(nil, PChar(AppName+' '+CmdLine), nil, nil, FALSE,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
PChar(ExtractFilePath(Prog)), SUInfo,
Prcs[PrcsCount]);
//وقفه جهت اجرا و باز شدن پنجره
if pR then
WaitForSingleObject(Prcs[PrcsCount].hProcess, INFINITE);
// RUN -> OpenProgram(PathExe+(Sender as TSpeedButton).Hint,' TDR '+User.UserName+' '+ User.Pass);
end;


کد دوستمون که واقعا زیبا تر است با ShellExecuteEx


var
SEI:TShellExecuteInfo;
procedure TForm1.btnRunClick(Sender: TObject);
begin
with SEI do
begin
cbSize := sizeof(TShellExecuteInfo);
fMask := SEE_MASK_NOCLOSEPROCESS;
lpVerb := 'open';
lpFile := PChar(txtFileName.Text);
lpParameters := '';
lpDirectory := PChar(ExtractFilePath(txtFileName.Text));
nShow := SHOW_OPENWINDOW;
end;
ShellExecuteEx(@SEI);
end;
procedure TForm1.btnKillClick(Sender: TObject);
begin
TerminateProcess(SEI.hProcess, 0);
end;