PDA

View Full Version : ساخت Setup دستی و اطلاع از نصب شدن برنامه MSDE در ویندوز



hadisalahi2
چهارشنبه 05 آذر 1393, 15:18 عصر
سلام به همه دوستان


من در حال ساخت یک Setup برای نرم افزارهای خودم هستم.
کلا نمیخوام از برنامه های ستاپ ساز استفاده کنم و میخوام مراحل نصب برنامه رو خودم انجام بدم.

حالا توی یکی از مراحل نصب ، لازمه تا MSDE قبل از ادامه عملیات ، روی سیستم مقصد نصب شده باشه.

حالا من میخوام وقتی کاربر روی دکمه مرحله بعد کلیک میکنه ، ابتدا چک کنه ببینه MSDE نصب شده یا نه؟
اگه نصب نشده بود اجازه ادامه عملیات رو نده.

یا البته یک حالت دیگه ، اینکه تا اتمام عملیات نصب MSDE ، برنامه قفل بشه و کاربر نتونه بره مرحله بعدی.

در هر دو حالت ، اون چیزی که من میخوام درسته.


حالا دوستان کسی هست که در این باره راهنمایی کنه بنده حقیر رو؟

اجرکم عند ا....

یوسف زالی
چهارشنبه 05 آذر 1393, 17:05 عصر
سلام.
باهاش کار نکردم ولی به نظر می رسه که داره از کلیدی در رجیستری استفاده می کنه.
این کلید رو مونیتور کن و به محض وجود داشتنش می فهمی که برنامه رو نصب کرد و اسکیپ نکرده.
البته باید همزمان هندل فرم نصب کننده رو هم کنترل کنی که باز نباشه.
یعنی :

1- اگر کلید در رجیستری نبود برو به 2 در غیر این صورت برو به 10
2- MSDE رو نصب کن
3- هندل MSDE رو به برنامه بده
4- منتظر بمون تا کلید در رجیستری بشینه و هندل هم بسته بشه
.
.
10- برنامه خودم رو نصب کن

خیلی راحتش بود الیته. یکم بیشتر باید کنترل بشه.

hadisalahi2
چهارشنبه 05 آذر 1393, 17:53 عصر
این کلید رو مونیتور کن و به محض وجود داشتنش می فهمی که برنامه رو نصب کرد و اسکیپ نکرده.

با تیکه کد زیر ، لیست برنامه های نصب شده رو به دست میارم:


procedure TForm2.Button1Click(Sender: TObject);
var
MyList: TStringList;
MyRegistry: TRegistry;
i: Integer;
Str: string;
begin
MyRegistry:=TRegistry.Create;
MyList:=TStringList.Create;
with MyRegistry do
begin
RootKey:=HKEY_LOCAL_MACHINE;
if OpenKey(
'Software\Microsoft\Windows\CurrentVersion\Uninsta ll',
False)=True then GetKeyNames(MyList);
CloseKey;


for i:=0 to MyList.Count-1 do
begin
RootKey:=HKEY_LOCAL_MACHINE;
OpenKey(
'Software\Microsoft\Windows\CurrentVersion\Uninsta ll\'+
MyList[i],
False);
Str:=ReadString('DisplayName');
// if Str&lt&gt'' then
Memo1.Lines.Add(ReadString('DisplayName'));
CloseKey;
end;
end;
end;


منظورت همین کلیده؟
چطوری اون کلید اصلی که مال MSDE هستش رو پیدا کنم؟




3- هندل MSDE رو به برنامه بده


این رو بلد نیستم ، میشه لطفا در این مورد راهنمایی کنی؟




4- منتظر بمون تا کلید در رجیستری بشینه و هندل هم بسته بشه


این انتظار رو با تایمر شبیه سازی کنم یا چیز دیگه ای؟

یوسف زالی
چهارشنبه 05 آذر 1393, 22:34 عصر
1- می دونم که کلیدی داره ولی حفظ که نیستم برادر!
2- با توابعی مثل findwindow یا توابع مشابه با دادن اسم یا کلاس فرم می تونی هندلش رو بگیری، می تونی از توابع cal back که تخصصی تره هم استفاده کنی.
3- انتظار رو با هر چیز دوست داری درست کن، من بودم در یک حلقه که sleep داره پیادش می کردم.

Mask
چهارشنبه 05 آذر 1393, 23:40 عصر
با اجازه استاد خودم:
خود ویندوز برای این انتظار ،توابع لازم رو در اختیار میزاره.(WaitForSingleObject)
در انتظار نمونه زیر، من برنامه اصلی رو مینیمایز کردم ، شما میتونید هر کاری خواستید انجام بدهید.(مثلا برنامه اصلی رو غیر فعال کنید)

function winexecandwait32(filename: string;visibility:integer):longword;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);
Application.Minimize;
if not CreateProcess(nil,zappname,nil,nil,False,CREATE_NE W_CONSOLE or NORMAL_PRIORITY_CLASS,nil,nil,startupinfo,processi nfo)
then begin
Result:= WAIT_FAILED;
end else
begin
WaitForSingleObject(processinfo.hProcess,INFINITE) ;
GetExitCodeProcess(processinfo.hProcess,Result);
CloseHandle(processinfo.hProcess);
CloseHandle(processinfo.hThread);
Application.Restore;
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
winexecandwait32('setup.exe',50);
end;

یوسف زالی
چهارشنبه 05 آذر 1393, 23:50 عصر
چطور حواسم نبود به CreateProcesss :متفکر:
راه حل بهتریه. همین روش رو برای اجرا و پایش برنامه انجام بده.
نمونش رو خودم تست کردم قبلا و خیلی خوب جواب می ده.
این طوری نیازی هم به جستجو برای هندل نیست.
فقط در تکمیل روش حمزه باید بگم که باید دوباره چک کنی ببینی شاید اصلا برنامه ستاپ رو یوزر کنسل کرده، یا هر بلای دیگه ای آورده ولی نصب نشده.
به هر جهت باید باز هم در پایان وجود یا عدم وجود کلید رو چک کنی.

hadisalahi2
پنج شنبه 06 آذر 1393, 10:26 صبح
1- می دونم که کلیدی داره ولی حفظ که نیستم برادر!

ببخشید این سوال چرتی بود که پرسیدم :لبخند:

حمزه جان اون عدد 50 که دادی چیه؟
بعد این 32 که ته پروسیجر نوشتی ، یعنی این کد فقط در 32 بیتی کاربرد داره یا 64 بیتی هم کار میکنه؟ :متفکر:

در ویندوز 7 یا 8 هم ردیفه دیگه ؟
آخه خیلی کدها هست که در XP مثل باقلوا اجرا میشه ولی در این ویندوز جدیدا اجرا نمیشه :عصبانی++:
قربون اون XP خودمون برم که طلا بود طلا :قلب:




فقط در تکمیل روش حمزه باید بگم که باید دوباره چک کنی ببینی شاید اصلا برنامه ستاپ رو یوزر کنسل کرده، یا هر بلای دیگه ای آورده ولی نصب نشده.

این قسمت رو با همون رجیستری چک کنم دیگه اوکی؟
با همون کدی که گفتم ردیفه دیگه؟

hadisalahi2
شنبه 15 آذر 1393, 16:08 عصر
حمزه جان این برنامه توی ویندوز 8.1 اجرا نمیشه :گریه:
وقتی به این شرط میرسه


if not CreateProcess(nil,zappname,nil,nil,False,CREATE_NE W_CONSOLE or NORMAL_PRIORITY_CLASS,nil,nil,startupinfo,processi nfo)
then begin
Result:= WAIT_FAILED;
end else

شرط برقراره و الباقی کد رو اجرا نمیکنه.
آیا این کد رو هم باید در یوزر administrator اجرا کرد؟

Mask
شنبه 15 آذر 1393, 18:45 عصر
آیا این کد رو هم باید در یوزر administrator اجرا کرد؟

جالبه، اغلب سوالاتی که میپرسید با یه تست کوچیک میشه نتیجه گرفت. احتمال زیاد وقتی دارید با پروسه ها کار میکنید ، غیر از privilege لازم، برنامه باید در مد admin اجرا بشه.
به جای سوال تست کن برادر من:لبخندساده:

hadisalahi2
یک شنبه 16 آذر 1393, 10:25 صبح
جالبه، اغلب سوالاتی که میپرسید با یه تست کوچیک میشه نتیجه گرفت. احتمال زیاد وقتی دارید با پروسه ها کار میکنید ، غیر از privilege لازم، برنامه باید در مد admin اجرا بشه.


شرمنده داداش ، بد سوال پرسیدم
وگرنه میدونم با یک تست به جواب میرسم

منظورم اینه که مثل همون روشی که شاهین روی رجیستری گفت که کلید access رو برای رجیستری تنظیم کرد که بدون مد ادمین برنامه ارجا بشه

آیا این کد رو نمیشه طوری اصلاح کرد که بدون اجرا در مد ادمین هم کار کنه ؟

یا حق

hadisalahi2
یک شنبه 23 آذر 1393, 16:45 عصر
یک مشکل وجود داره :افسرده:
موقعی که در ویندوز XP میخوام MSDE رو نصب کنم ، (از داخل Setup خودم) در آخر نصب ، برنامه setup قفل میکنه و نصب MSDE به اتمام نمیرسه

اول فکر کردم مشکل از نسخه MSDE هستش
ولی وقتی از جداگانه نصبش میکنم ، خیلی راحت نصب میشه.

به نظرت مشکل کجاست؟ :متفکر:

hadisalahi2
چهارشنبه 26 آذر 1393, 10:14 صبح
برادر حمزه ، این کد در ویندوز XP مشکل داره
بگو چرا؟

وقتی برنامه ستاپ MSDE رو با پروسیجر winexecandwait32 اجرا میکنم ، هنگام نصب ، در آخرای نصب ، دیگه نصب تکمیل نمیشه و روی همون 6 ثانیه مونده به آخر وایمیسته و برنامه قفل میشه

اما وقتی اینطوری فراخوانی میکنم ، برنامه نصب کامل اجرا میشه و نصب هم صورت میگیره



ShellExecute(Handle, 'Open', Pchar(ExtractFilePath(Application.ExeName) +
'MSDE2000\setup.exe'), nil, nil, SW_SHOW);




البته روی ویندوز 7 یا 8 تست نکردم
اما روی XP همچین مشکلی داره