بسم الله الرحمن الرحيم
يه صحبت كوتاه
سلام به دوستان عزيزي كه از دور و نزديك اين متن رو دارند مي خونند اميدوارم در سايه حق تعالي اميدوار با پشتكار، سر بلند ، موفق و سر زنده باشند،تلاش اينجانب و دوستان بر اين هست كه مطالب و تجربيات و رفرنس هاي موجود را به بهترين و ساده ترين راه منتشر كنند.اميد وارم شما نيز به جمع ما بپيونديد. درانتها بيش از هرچيز منتظر سوالات ،انتقادات و تشكر شما از عزيزاني كه به عشق يگانه برنامه نويس عالم كارمي كنند هستيم.
شما هم مي تونيد در يك حركت خارق العاده با ما باشيد
تشكر ويژه از دوستاني كه اين بنده را در اين تايپيك ياري كرده اند:
Hossein-Khoshseyar و Sharif Lotfi و b.mahsa
مراحل ساختن setup توسط Vs.net
بعد از اینکه پروژه خودتون رو تو vs.net ساختید (برنامه کاربردی ) حالا نیاز دارید که یه setup برای همین برنامه بسازید . از منوی file->add->new Project کلیک کنید
Other Project type->setup Project
در فرم new project add بر روی setup project کلیک کنید
بعد از Ok کردن می بینید که به پروژه شما در بخش solution explorer پروژه setup اضافه می شود.
بر روی پروژه setup راست کلیک کنید می بینید که منوی باز شده گویای همه چیز است.
شما می تونید هر بخشی را که دوست دارید ویرایش ،اضافه یا حذف کنید .
من به مهمترین Item ها می پردازم که بعد از ساخت setup دچار مشکل نشید.
قراردادن خروجی برنامه کاربردی شما در setup
بعد از راست کلیک کردن بر روی پروژه setup از زیر منوی view بر روی File System کلیک کنید.
شما وارد بخش file system می شوید که حاوی سه پوشه هست روی پوشه Application Folder کلیک کنید تا وارد آن شوید
برای آنکه خروجی پروژه تان در Setup قرار گیرد، در جایی خالی راست کلیک کرده از زیر منوی add-> Project Output کلیک کنید.
در منوی Add Project Output بر روی Primery Output کلیک کنید ،حال بعد از تجزیه وتحلیل پروژه شما dllها و فایل اجرایی شما به صورت شکل زیر به پروژه اضافه می شود.
ساختن Shortcut برنامه بر روي Desktop و All Programs كاربر
براي اينكه Setup شما بتونه روي Desktop و All Programs كاربر ، Shortcut بسازه.مراحل زير رو بايد انجام بديد.
بر روي فايل Primery Output From داخل پوشه Application Folder راست كليك كنيد روي آيتم Create Shortcut From Primery Output كليك كنيد.
حال Shortcut ساخته شده رو وارد پوشه User's Desktop در پنجره سمت چپ نماييد.
همين مراحل رو براي Programs File تكرار كنيد.
نصب برنامه هاي مورد نياز پروژه
حالا دقت کنید مهمترین بخش در setup سازی بخش نصب برنامه های جانبی مورد نیاز برنامه شماست .
برای اضافه کردن برنامه های مورد نیاز برنامه کاربردی شما باید روی پروژه STUP کلیک راست کرده و بروی گزینه propertiesکلیک کنید.ودر فرم باز شده بر رویprerequisites دکمه کلیک کرده و در فرم بعدی موارد مورد نیازتان را تیک زده و بر روی prerequisites from the same location as my application download کلیک کنید.
تغيير متن فرم خوش آمد گويي
اول روي پروژه راست كليك كنيد از زير منوي Add روي User InterFace كليك كنيد.
در پنجره سمت راست روي فرم Welcome راست كليك كرده و روي Peropertis Windows كليك كنيد.
در پنجره Properties مي تونيد ايتم هاي مورد نظرتون رو عوض كنيد.
اضافه كردن يك فرم به Setup
قصد داريم فرم Customer Informationرو به Setup خودمون اضافه كنيم براي اين كار اول در پنجره سمت راست در زير گره Install روي Start راست كليك كرده و روي ايتم Add Dialogكليك كنيد در پنجره باز شده روي فرم Customer Information كليك كنيد تا به اين گره اضافه شود.
حالا پروژه تون رو Bulid كنيد،بايد پروژه بدونه نقص Build بشه اگه Error داد مشكل از اين mergemod.dll هست كه بايد تو ويندوزتون رجستر كنيد.
مراحل رجستر كردن تو اين آدرس هست (راحته)
http://support.microsoft.com/kb/329214
دوست عزيز يه سري هم به اين سايت بزن
http://aspalliance.com/622_StepbySte...ment_Project.1
حالا پروژه تان را build کنید.
طريقه قراردادن سريال براي Setup
البته دوستان دقت داشته باشيد كه قراردادن قالب يا فرمي كه سريال دريافت كنه يه جورايي فرماليته هست ولي با تكنيك هايي كه بعد ها گفته خواهد شد ميشه يه سريال مطمئن داشت.
بعد اضافه كردن Customer Information در پنجره Properties بايد ShowSerialNumber را برابر True نماييد مانند شكل زير.
نكته بسيار مهم در اين پنجره SerialNumberTemplate است كه قالب دريافت سريال را به شما نشان مي دهد <%%%%%%%%-###>
در اين قالب كاراكتر هاي # و % و - را مي بينيد كه هريك نشان دهنده ورودي خاصي است.
خط تيره جعبه متن هايي را نشان مي دهد كه در ان بايد سريال وارد شود.
مثلا در قالب بالا ما دو جعبه متن براي دريافت سريال داريم كه اولي بايد 3 كاراكتر در آن وارد شود و دومي 7 كاراكتر سريال در آن وارد مي شود.
اينسالر كاراكتر# را ناديده مي گيرد،ولي اساس تست سريال بر روي كاراكتر هاي % است كه جمع مقادير وارد شده به جاي اين كاراكتر ها تقسيم بر 7 بايد صفر شود.
مثلا اگر در اين قالب سريال :1111111-111 را وارد نماييد مراحل نصب انجام مي شود
مثال :<###%%-####%-%#%-###>
اين قالب براي در يافت سريال 4 جعبه متن را نشان مي دهد .
و يكي از سريال هاي ان اين مي باشد.
11000-10000-301-000
0=7/(3+1+1+1+1)
جمع اين اعداد 21 يا 28 و...
هم شود سريال درست است.
اگر صفر بود سريال درست است.
قبل از اينكه وارد بخش حرفه اي مقاله بشيم جاداره كه از دوست پيگير مون آقاي Hossein-Khoshseyar تشكر به عمل بياد شايد پيگيري هاي ايشون نبود چنين مقاله اي توي تايپيك گنجانده نمي شد.
گفتيم كه قرار دادن سريال براي Setup به صورت عادي در Vs.net كاري الكي هست و هر فردي مي تونه سريال شما رو حدس بزنه براي اينكه سريالي قوي و حرفه اي داشته باشيد ، بايد به ادامه آموزش دقت كنيد.
حرفه اي :اضافه كردن Dll به Setup كه صحت سريال هاي Setup را تاييد مي كند
Orca ابزاري است كه شركت مايكروسافت براي ويرايش دقيق تر و حرفه اي ستاپ ها ارائه كرده ،اين برنامه معمولا داخل پوشه Microsoft SDKs هست، يا كلمه Orca رو داخل درايو C جستجو كنيد .
براي ساخت Dll ما به Vs.net C++ نياز داريم دوستاني كه مي خواهند Dll بسازند با مراحل ايجاد پروژه Dll آگاه هستند و دوستان ديگر مي توانند از پروژه نمونه استفاده كنند مهم بكار گيري كد زير درون Dll مي باشد كه دوستان حرفه اي مي توانند بنا به خواست نياز خود آن را تغيير دهند.
براي انكه سريعتر به اصل مطلب برسيم دوستان نمونه پروژه ساختن Dll رو از زمينه بردارند. و از روي آن كاركنند.
پروژه ساخت dll نمونه تست شده (ضميمه)
#include "windows.h"
#include "msi.h"
#include "msiquery.h"
extern "C" _declspec(dllexport) UINT __stdcall VerifyPID(MSIHANDLE hInstall);
TCHAR* GetPIDValue(TCHAR*);
extern "C" UINT __stdcall VerifyPID(MSIHANDLE hInstall)
{
UINT nRetVal = 0;
UINT uiMsiRc;
TCHAR szPidKey[MAX_PATH];
TCHAR szSourceDir[MAX_PATH];
TCHAR* lpszPidValue;
DWORD dwBuffer;
dwBuffer = sizeof(szSourceDir)/sizeof(TCHAR);
uiMsiRc = MsiGetProperty(hInstall, TEXT("SourceDir"), szSourceDir, &dwBuffer);
if (ERROR_SUCCESS != uiMsiRc)
{
MessageBox(NULL, "Not able to retrieve the SourceDir property. The setup may be corrupt. Please contact Technical Support.", "Setup Error", MB_OK | MB_ICONEXCLAMATION);
return 0;
}
lpszPidValue = GetPIDValue(szSourceDir);
dwBuffer = sizeof(szPidKey)/sizeof(TCHAR);
uiMsiRc = MsiGetProperty(hInstall, TEXT("PIDKEY"), szPidKey, &dwBuffer);
if (ERROR_SUCCESS != uiMsiRc)
{
MessageBox(NULL, "Not able to retrieve PIDKEY property. The setup may be corrupt. Please contact Technical Support.", "Setup Error", MB_OK | MB_ICONEXCLAMATION);
return 0;
}
int str = lstrcmp(szPidKey, lpszPidValue);
if (str == 0)
MsiSetProperty(hInstall, "PIDCHECK", "TRUE");
else
{
MsiSetProperty(hInstall, "PIDCHECK", "FALSE");
MessageBox(NULL, "Please enter the correct product registration code!", "Invalid Key", MB_OK | MB_ICONINFORMATION);
}
return 0;
}
TCHAR* GetPIDValue(TCHAR* lpszSourceDir)
{
return "123 - 4567890";
}
دقت كنيد كه اين DLL براي BUILD شدن نياز به تنظيماتي داردكه در ادامه توضيح مي دهيم.
از منوي PROJECT بر روي زير منوي PIDCheckDll در پنجره باز شده از سمت چپ رو گره C/C++ كليك كنيد از آيتم هاي اين گره بر روي GENERAL كليك كنيد و خاصيت Additional Include Directories را با مسير نصب Sdk در هاردتان مسير دهي كنيد.
مثلا c:\Program File \Microsoft Sdk \ include
از گره Linker بر روي ايتم Input كليك كنيد،درون خاصيت Additional Dependencies كلمه Msi.Lib را تايپ نماييد.
چك كنيد كه خصوصيات شما در اين دو فرم شبيه تصوير باشد.
درباره سورس Dll
تابع VerifyPID ابتدا توابع كتابخانه اي Msi رو براي دريافت سريال واردشده از طرف كاربر درون باكس PidKey فراخواني مي كند.يعني كاربر چه سريالي درون باكس وارد كرده است.
بعد سريال وارد شده را با سريال داخلي فايل مقايسه مي كند در صورت صحت داشت كلمه True را درون خصوصيت داخلي PIDCHECK يا در صورت اشتباه بودن كلمه False را درون اين خصوصيت قرار مي دهد طريق تعريف خصوصيتي مانند PIDCHECK را در ادامه توضيح مي دهيم با اين خصوصيت مي توانيد حدس بزنيم كه كاربر سريال را درست وارد كرده است تا به صفحه بعد Setup برويم.
ساخت پروژه Setup مورد نظر
يك پروژه ستاب براي خودتان بسازيد و در بخش user interface فرم Customer Information dialogرا اضافه كنيد .پروژه ساخت را Build نماييد.
تغييرات حرفه اي در Setup ساخته شده و پشتيباني از سريال :
خلاصه مراحل:
حال مي خواهيم فايل Msi ساخته شده توسط پروژه Setup را با استفاده از نرم افزار Orca (ساخت شركت مايكروسافت) ويرايش نماييم.
اول بايد فايل Dll را به فايل Setup اضافه كنيم ، فايل داخل Dll جا داده مي شودو نيازي نيست آن را همراه فايل Setup داشته باشيم.مرحله بعد ساخت يك Custom Action است كه وظيفه آن فراخواني توابع داخل Dll مي باشد ،كه بايد هنگامي كه برنامه Setup اجرا مي شود انجام گيرد. و بعد ما بايد يك متغيير Booleanايجاد كنيم كه مقادير خروجي از Custom Action در آن قرار گيرد.و در آخر يك شرط قرار مي دهيم كه در صورت True بودن مقدار متغيير به فرم بعدي Setup برويم.
اضافه كردن فايل DLL به فايل Setup:
برنامه Orca را نصب كنيد ، اين برنامه در صورت نصب بودن Microsoft Sdk داخل درايو C شما موجود مي باشد.بعد از اجراي برنامه Orca فايل .Msi (دانلود)موجود در release يا Debuge خود را از طربرنامه باز نماييد() ، بعد از باز كردن اين فايل درون محيط نرم افزار در سمت چپ جدول هاي Setup شما كه مي توانيد تغيير دهيد و در سمت راست فيلد هاي اين جداول وجود دارد.
بر روي جدول Binaryكليك نماييد.بر روي يكي از ركوردهاي خالي دوبار كليك كنيد، يا از منوي Tables بر روي آيتم Add row كليك كنيد تا فرم مورد نظر باز شود،داخل فيلد Name كلمهPIDCheckDllرا وارد كنيد،بر روي فيلد Data كليك كنيد،و بر روي دكمه Browse كليك كنيد،فايل Dll را انتخاب كنيد وOkنماييد.حال فايل Dll شما داخل فايل Msi گنجانده مي شود.
اضافه كردن:Custom Action
جدل Custom Actionانتخاب نماييد،و يك ركورد جديد ايجاد كنيد ، مقادير زير را در فرم باز شده وارد نماييد.
Action: CheckPID
Type: 1
Source: PIDCheckDll
Target: _VerifyPID@4
داخل فيلد Action شما نامي براي اينCustom action انتخاب كرده ايد و در فيلد Type عدد يك نشان دهنده آن است كه اين Custom action از يك Dll مخفي شده (همان Dll خودمان)در حال استفاده است ،فيلدSource يعني ما به اين Dll وصل شده ايم كه در مرحله اضافه كردن به خاطر داريد كه اين اسم را براي Dllوارد كرديم ، فيلد Target يعني كدام تابع را داخل اين Dll فراخواني كن.
ايجاد و پيكر بندي خصوصيات مورد نياز:
در اينجا ما بايد متغيير هاي داخلي را ايجاد كنيم كه شرط هاي اعتبار سنجي و بين فرم ها بر روي آن ها استوار است.
مثلا اول بايد خصوصيت PIDCHECKرا ايجاد كنيم كه مقدار آن يا True يا False است و در Setup با استفاده از اين خصوصيت مي توانيم متوجه بشويم كه سريال درست است يا اشتباه.
جدول Propertyرا انتخاب كنيد يك ركورد جديد ايجاد نماييد.و مقادير زير را در فرم باز شده وارد نماييد.
Property: PIDCHECK
Value: FALSE
حال بايد قالب دريافت سريال رو مشخص كنيم ، (يعني چندتا TextBox باشه )
توي اين آموزش ما خيال داريم كه قالب در يافت سريال از دو TextBox تشكليل شده باشه،مثلا4567890-123
براي داشتن چنين قالبي بايد داخل خصوصيت PIDTemplate مقدار <### - #######> رو وارد كنيد ، اگه PidTemplate رو نداريد امكان داره شما هنگام ساخت Setup فرم Customer Informationرو اضافه نكرده ايد.هنگام اجراي فايل setup دو تا Text Box مي ايد كه اولي قادر به در يافت 3 عدد و دومين TextBox قادر به دريافت 7 عدد از ورودي مي باشد.
مقدار فيلد CustomerInfoForm_ShowSerialرا برابر 1 قرار دهيد تاTextBox ها درون Setup به نمايش در بيايند،
پيكربندي فرم ها
جدولControlرا باز كنيد،ركوردCustomerInfoFormپيدا كنيد،حال ركوردي كه فيلد Control آن برابر SerialEdit هست را پيدا كنيد،مقدار فيلد Attributeرا برابر 3 قرار دهيد ، SerialLabelوهمين اعمال را براي SerialBodyTextانجام دهيد،
جدولControlEvent انتخاب كنيد، از فيلد DialogمقدارCustomerInfoFormرا پيدا نماييد،حال ركوردي را پيدا كنيد كه فيلد Control آن برابر NextButtonو مقدارEventآن برابر ValidateProductID .
مقدار فيلد Event را از ValidateProductID به DoActionتغيير دهيد و مقدار فيلد Argumentرا از{}به CheckPIDتغيير دهيد،
حال ركوردي را پيدا كنيدكه فيلدControl آن برابر NextButtonو فيلد Event ان برابر NewDialog مي باشد ، مقدار داخل فيلد Condition آن را پاك كرده و جمله زير را وارد كنيد.
(PIDCHECK="TRUE") AND CustomerInfoForm_NextArgs<>"" AND CustomerInfoForm_ShowSerial<>""
منبع:
متن بالا ترجمه شده متن موجود در آدرس زير است .دوستان كمي و كاستي هايي وجود دارد كه اينجانب خوشحال مي شوم كه در جريان بگذاريد.
http://www.codeproject.com/KB/install/msinetserial.aspx
طريقه ساخت شورتكات براي uninstall برنامه:
دوستان متن زير به تلاش دوست عزيز و كاربر فعال سايت آقاي Sharif Lotfi فراهم آمده كه جاداره به نوبه خودمون از اين دوست تشكر كنيم.آدرس پست ايشون براي تشكر
اگر با VB.Net كار مي كنين به اين صورت عمل كنين :
در بخش ساخت setup در فولدر user's programs menu يا هر جاي ديگه اي كه مي خواين يك shortcut جديد اضافه كنين با نام uninstall myProject (يا هر اسمي كه دوست دارين)
فايلي كه ازش shortcut مي سازين همون primary output هست (همون فايل اجرايي كه از مسير application folder مي ريم) همونطور كه مي بينين اين دقيقا همون فايلي هستش كه براي اجراي برنامه مون ازش استفاده مي كنيم.
روي shortcut جديدي كه ساختين راست كليك كنين و properties رو انتخاب كنين و اين تغييرات رو بدين:
مقدار گزينه Arguments رو برابر
کد HTML:
/u=[ProductCode]
بذارين
نام و توضيحات Description مربوط به uninstall رو به دلخواه خودتون تغيير بدين .
حالادر ماژول Main كد زير رو بنويسين :
کد:
کد HTML:
Dim arguments As String() = Environment.GetCommandLineArgs()
Dim myArgument As String()
Dim myString As String
For Each argument As String In arguments
Dim myChar As Char() = {"="c}
myArgument = argument.Split(myChar)
myString = myArgument(0)
If myString.ToLower() = "/u" Then
Dim guid As String = myArgument(1)
Dim path As String = Environment.GetFolderPath(Environment.SpecialFolder.System)
Dim si As ProcessStartInfo
si = New ProcessStartInfo(path + "\\msiexec.exe", "/i " + guid)
Dim myProcess As Process
myProcess = Process.Start(si)
myProcess.Close()
Application.Exit()
End
End If
Next
طریقه اضافه كردن نام و آيكون برنامه توي راست كليك در محيط اكسپلورر ويندوز
نويسنده متن: آقاي Sharif Lotfi
براي تشكر از ايشون به پست ايشون مراجعه مي كنيم
اين هم روش اضافه كردن نام برنامه در راست كليك موس در محيط اكسپلورر ويندوز وقتي كه بخواهيم ويندوز به صورت اتوماتيك با استفاده از پسوند فايل برنامه باز كننده آنرا كه برنامه ماست تشخيص دهد :
روي پروژه ستاپ راست كليك كرده و گزينه ي view وسپس گزينه ي File Types رو انتخاب مي كنيد
در تب File Types روي آيتم File Types on target Machine راست كليك كرده و گزينه ي Add File Type رو كليك مي كنيم.
يك آيتم اضاقه مي شه با نام (New Document Type #1 (no extention
روي اين آيتم كليك كرده و در پنجره Properties در سمت راست مشخصات دلخواهتون رو تنظيم كنين
با فرض اينكه نام نرم افزار شما MySoftware و پسوند فايلهاي مخصوص نرم افزار شما m1.* باشه پيش مي ريم :
گزينه اول كه نام آيتم انتخاب شده است (مي تونه همون نام پيش فرض باشه)
گزينه دوم فايل اجرايي برنامه شماست . كه در محيط ساخت ستاپ اين فايل اجرايي همون Primary Output هستش كه اونو بايد انتخاب كنين و بعد از انتخاب جلوي اين گزينه عبارت
(Primary output from MySoftware(Active ديده خواهد شد . حواستون باشه كه منظورم فايل exeبرنامه نيست
گزينه سوم توضيح مربوط به نرم افزار شماست عبارتي كه اينجا مي نويسين در محيط ويندوز ديده ميشه مثلا بنويسين : MySoftware File يا هر عبارت توضيحي دلخواه
گزينه چهارم معرفي پسوند فايل مخصوص نرم افزار شماست كه بايد بدون نقطه معرفي بشه براي مثال شما مي نويسين m1
گزينه پنجم معرفي آيكون مخصوص فايلهاي m1 هستش با معرفي آيكون دلخواه شما در محيط اكسپلورر ويندوز فايلهاي با پسوند m1 با اين آيكون ديده ميشن
گزينه ششم رو بلد نيستم (پس به درد نمي خوره )
آيتم ساخته شده شما حالا اين شده :
(New Document Type #1 (m1
خوب ، تا اينجا مربوط بود به معرفي فايل با پسوند m1 به برنامه و شناختن اون
حالا مي ريم سراغ تعريف آيتمهايي كه موقع راست كليك در محيط اكسپلورر ويندوز بايد ديده بشن:
روي آيتمي كه ساختين (New Document Type #1 (m1 راست كليك كنين
گزينه Add Action رو انتخاب كنين
آيتم New Document Action #1 اضافه ميشه
روي اين آيتم كليك كرده و در پنجره Properties در سمت راست مشخصات دلخواهتون رو تنظيم كنين
گزينه اول Name عبارتي هست كه قراره شما در منوي راست كليك ماوس ببينيد مثلا اين عبارت
"Open with "MySoftware&
گزينه دوم رو برابر
کد HTML:
"%1"
بذارين
براي گزينه سوم هم عبارت open رو بنويسين
و تمام
حالا بعد از ساخت كامل ستاپ و نصب برنامه مي تونين روي فايل با پسوند m1 راست كليك كنين و منوي اضافه شده رو ببينين .
نمونه پروژه
اين هم يه پروژه نمونه براي دوستان تا مطالب رو بهتر و عملي تر ببينن
توي اين پروژه موارد زير رو داريم :
ساخت يك ديتاتيبل و ديتاگريد
باز كردن و ذخيره كردن يك فايل با پسوند shs
ساخت setup
ايجاد شورتكات براي uninstall
اضافه كردن نام برنامه در راست كليك ماوس در محيط اكسپلورر ويندوز
قابليت خواندن و باز كردن فايل با راست كليك روي فايل يا دابل كليك آيكون فايل
(دقت داشته باشين كه مراحل آخر در محيط ويژوال استوديو قابل دسترسي نيستن و بعد از ساخت ستاپ در محيط اكسپلورر و اجراي فايل ستاپ مي تونين اين قابليتها رو ببينين- يعني بعد از توسعه)
دانلود پروژه
چگونه از پرتال بودن برنامه جلوگيري كنيم
اگر دقت داشته باشيد برنامه شما بعد از نصب پك هاي مورد نياز خودش و اجراي صحيح روي سيستم كاربر به هر فردي كه حتي با كمترين اطلاعات مي تونه پك هاي مورد نياز فايل اجراييتون رو بدست بياره و فايل تون رو هر جاي ديگه نصب كنه.
براي جلوگيري از اين كار روش هاي مختلفي هست .
ولي يكي از كم هزينه ترين راه ها كار با رجستري هست كه كپي از نرم افزارتون رو تا حدي از اون جلوگيري مي كنه.
طريق Setup يه كليد توي رجستري بسازيد .مسيرش داخل تصوير مشخصه.
بعد داخل برنامه يا Form Load اولين فرم تون كد پايين رو بنويسيد.
IfMy.Computer.Registry.GetValue("HKEY_CURRENT_USER \Software\My Software", "Run", Nothing) IsNothingThen
MsgBox("اين نسخه معتبر نمي باشد")
Close() 'خروج از نرم افزار
EndIf
برچسب ها
ساخت ستاپ با ويژوال دات نت ،طراحي ستاپ با ويژوال
ساخت ستاپ،ساخت Setup با Microsoft Visual Studio
ساخت Setup با Setup and Deployment
ساخت ستاپ با Vs.net
اگه سئوالی بود در خدمتم.
به اميد خدا ادامه دارد.....