PDA

View Full Version : سوال: مشکل در CreateProcess



Mask
یک شنبه 19 تیر 1390, 21:55 عصر
با عرض سلام.
پیرو مشکل قبلیم که توسط یک سرویس یک فایل رو اجرا میکردیم و فرم برنامه اجرا شده در دسکتاپ فعال نمایش داده نمیشد.
پس از چندی تحقیق به این نتیجه رسیدم که: چون سرویس در یه دسکتاپ دیگه اجرا میشه ، در این صورت فرم برنامم هم در همون دسکتاپ قابله مشاهدست.
در نتیجه با تحقیق متوجه شدم چون ما برناممون رو توسط CreateProcess اجرا میکنیم ، باید اسم دسکتاپ فعال رو به متد StartInfo.lpDesktop در CreateProcess بفرستیم تا برناممون در دسکتاپ اصلی نمایش داده بشه.
حالا سوالم اینه که چطوری باید مقدار StartInfo.lpDesktop رو بدست بیارم.(یعنی اسم دسکتاپ فعال رو)
ممنون از دوستان.

procedure TServicTest.ServiceStart(Sender: TService; var Started: Boolean);
var
StartInfo : TStartupInfo;
ProcInfo : TProcessInformation;
begin
FillChar(StartInfo,SizeOf(TStartupInfo),#0);
FillChar(ProcInfo,SizeOf(TProcessInformation),#0);
StartInfo.cb := SizeOf(TStartupInfo);

StartInfo.wShowWindow:=SW_SHOWMAXIMIZED;
StartInfo.lpDesktop:=???;

CreateProcess(nil, PChar('c:\t.exe'), nil, nil,False,
CREATE_NEW_PROCESS_GROUP+NORMAL_PRIORITY_CLASS,
nil, nil, StartInfo, ProcInfo);
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
end;

tdkhakpur
دوشنبه 20 تیر 1390, 00:14 صبح
حالا که این همه راه رو رفتیید یه خورده در مورد


SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, PIDL) ;

تحقیق کنید مشخصات دسک تاپ رو از این طریق میتونید بدست بیارید اما بطور کلی با سرویس نمیتوانید برنامه های رو به حال ویژال اجرا کنید.

Mask
سه شنبه 21 تیر 1390, 16:33 عصر
اما بطور کلی با سرویس نمیتوانید برنامه های رو به حال ویژال اجرا کنید.
لطفا بدون اطلاعات نظریه ندید.

tdkhakpur
پنج شنبه 23 تیر 1390, 22:12 عصر
لطفا بدون اطلاعات نظریه ندید.

خب کدی رو داخل سرویست قرار بده که یک دونه فرم رو نشون بده تا اطلاعاتمون در این مورد اضافه بشه .(جدی میگم)
پاورقی:
هر مبتدی در هر موردی که تازه شروع به کار میکند همیشه باید خودش را اندر خم یک کوچه بداند تا زودتر به نتیجه مطلب مورد نظرش برسد.
انیشتین.

Mask
چهارشنبه 29 تیر 1390, 17:50 عصر
با سلام.
یه چند روزی سرم شلوغ بود و نتونستم جواب ابن دوستمون رو بدم.
با اینکه میدونم ماشاالله اعتماد به نفستون فوق العادست و باز هم با نمونه ای که ضمیمه میکنم. حرف برا گفتن دارید. یه نمونه ضمیمه کردم.
میتونید با install کردن سرویس ، ببینید که به راحتی یک برنامه با فرم و امکانات کامل در سطح یوزر سیستم به کاربر نمایش داده میشه.
موفق باشید.

Felony
چهارشنبه 29 تیر 1390, 19:32 عصر
اسم Desktop فعال که شما درش دارید کار میکنید ؟ اسم پیش فرض میز کار اصلی default هست .

برای گرفتن لیست Desktop ها میتونید از تابع EnumDesktops استفاده کنید ؛ برای گرفتن لیست Window Station ها هم از EnumWindowStations که هر دو Callback Function هستن ، یه نمونه کد براتون نوشتم که نام Desktop ها و Window Station هایی که در Session جاری قرار دارن رو نمایش میده :


function Desktops(DesktopName: Pchar; Lines: TStrings): Boolean; stdcall;
begin
Result := True;
ShowMessage('Desktop : ' + DesktopName);
end;

function WindowStation(StationName: Pchar; Lines: TStrings): Boolean; stdcall;
begin
Result := True;
ShowMessage('Station : ' + StationName);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Clear;
EnumDesktops(GetProcessWindowStation, @Desktops, 0);
EnumWindowStations(@WindowStation, 0);
end;

قبل از تغییر Desktop باید اجازه استفاده از Station ی که Desktop مورد نظر توش قرار داره رو به پروسه برنامتون بدید چون Desktop جزئی از Station به حساب میاد ، توسط تابع SetProcessWindowStation (http://msdn.microsoft.com/en-us/library/ms686232(v=vs.85).aspx) هم میتونید اجازه استفاده از یک Station رو به یک پروسه بدید .

برای تغییر میز کار بعد از ساخت برنامه هم باید از SetThreadDesktop (http://msdn.microsoft.com/en-us/library/ms686250(v=vs.85).aspx) استفاده کنی .

دیگه حوصله ندارم بیشتر توضیج بدم ، در ضمن اینم برای شما خوبه ( به نقل از MSDN ) :


Warning There is a significant security risk for any service that opens a window on the interactive desktop. By opening a desktop window, a service makes itself vulnerable to attack from the logged-on user, whose application could send malicious messages to the service's desktop window and affect its ability to function.

tdkhakpur
پنج شنبه 30 تیر 1390, 01:13 صبح
با سلام.
یه چند روزی سرم شلوغ بود و نتونستم جواب ابن دوستمون رو بدم.
با اینکه میدونم ماشاالله اعتماد به نفستون فوق العادست و باز هم با نمونه ای که ضمیمه میکنم. حرف برا گفتن دارید. یه نمونه ضمیمه کردم.
میتونید با install کردن سرویس ، ببینید که به راحتی یک برنامه با فرم و امکانات کامل در سطح یوزر سیستم به کاربر نمایش داده میشه.
موفق باشید.
که چی بشه؟
قرار بود کاری کنید که به اطلاعاتمون اضافه بشه نه اینکه یه تیکه برنامه قرار بدید.
در ضمن شما صحبت service کرده بودید اینجا کدوم سرویس به شما اجازه ایجاد DC در سطح گرافیک رو میده؟
میتونید سورس برنامه سرویس رو ارسال کنید که میتونه فرم رو نشون بده.