ورود

View Full Version : installshield



baran_2005
یک شنبه 08 شهریور 1388, 15:48 عصر
تاپيك هاي زيادي درباره installshield وجود دارد . شايد ايجاد اين تاپيك ضرورتي نداشته باشد اما با اين همه فكر مي كنم درباره اين موضوعات صحبت نشده باشد يا لااقل من نديدم . اميدوارم مورد استفاده دوستان قرار بگيرد .


1- اسکریپت اضافه کردن alias در Client Network Utiliy
راه حلی که من استفاده کردم نوشتن اسکریپتی برای تغییر در رجیستری ویندوز است . که در مسیر HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLS erver\Client\ConnectTo

تمام الیاس های تعریف شده قرار دارد . حال برای اضافه کردن یک الیاس جدید کافی است که کد زیر را بنویسید :





RegDBSetDefaultRoot( HKEY_LOCAL_MACHINE );
RegDBSetKeyValueEx ( "Software\\Microsoft\\MSSQLServer\\Client\\ConnectT o\\"
,str_name_system_server+"\\"+str_instansename1, REGDB_STRING, "DBNMPNTW,\\"+"\\data\\pipe\\MSSQL$"+str_instansename1+"\\sql\\query", -1 );


که str_instansename1 نام instance و str_name_system_server نام سرور است .

با RegDBSetDefaultRoot نام ریشه را مشخص می کنیم . RegDBSetKeyValueEx مقادیر خود را برای اضافه کردن مشخص می کنیم . که مسیر ، نام ، نوع ، مقدار و سایز را می دهیم . که با تغییر در کد می توانید هر مقادری را به رجیستری اضافه کنید .

2- استفاده از متغیر ها در installshield
شاید شما در installshield به مقداری که کاربر وارد می کند نیاز داشته باشید که برای این کار باید یک متغیر سراسری تعریف کنید . برای تعریف یک متغیر سراسری که بتوان از آن در تمام توابع و دیالوگ ها استفاده کرد مراحل زیر را طی کنید .

در Behavior and logic گزینه installscript را انتخاب کنید حالا در سمت راست سه شاخه می بینید files , function و properties بر رو ی properties راست کلیک و add new property را کلیک کنید . در قسمت property name نام متغیر را وارد کنید . در قسمت data type نوع آن را مشخص کنید و در Local Variable Name نامی را که در حین کدنویسی به آن نیاز دارید را تایپ کنید . در Default Value هم مقدار پیش فرض خود را قرار دهید . بر روی ok کلیک کنید . خواهید دید که نام متغیر به لیست properties شما اضافه خواهد شد . اگر اضافه نشد باید آن را تعریف کنید برای این کار کد زیر ررا با نام متغیر خود در بالای فرم تعریف کنید در اینجا متغیری با نام sale از نوع number تعریف شده است .


property(get,put) NUMBER sale();
NUMBER m_sale
و پنج تابع زیر هم اضافه خواهد شد .



function InitProperties()
begin
m_nsale = 0;
end;

function ReadProperties(PropertyBag)
begin
ReadNumberProperty(PropertyBag, "sale", m_nsale);
end;

function WriteProperties(PropertyBag)
begin
WriteNumberProperty(PropertyBag, "sale", m_nsale);
end;

function NUMBER get_sale()
begin
return m_nsale;
end;

function void put_sale(newVal)
begin
m_nsale = newVal;
end
حال هر جا که احتیاج داشتید با فراخوانی متغیر خود (m_sale) می توانید از آن استفاده کنید .

3-فارسی کردن برنامه نصب با installsheild
افراد زیادی برای ساخت یک برنامه نصب از installshield استفاده می کنند . مزیت این نرم افزار نسبت به بقیه پشتیبانی قوی نسبت به بانک ها ی اطلاعاتی است اما نسبت به پشتیبانی فارسی کمی دچار مشکل می شویم . درباره این نرم افزار و نحوه کار کردن با آن در سایت های مختلف به صورت تکراری بیان شده است که من آنها را بیان نمی کنم . در اینجا چگونه فارسی کردن مراحل setup را یاد می گیریم . که کمترجایی عنوان شده است .

روش اول :

در زمان ایجاد پروژه جدید گزینه Basic MSI Project را انتخاب کنید در این صورت امکانات شما کمتر است . اما برای انجام یک پروژه کوچک مناسب است . در این محیط دست شما برای کدنویسی باز نیست . در نسخه 10.5 و 2008 این نرم افزار از منوی tools\add new language می توانید زبان فارسی را به برنامه خود اضافه کنید (البته شاید در نسخه های دیگر آن هم این گزینه باشد اما من در نسخه2009 پیدا نکردم اما در نسخه کامل آن زبان فارسی و یا عربی به لیس زبان ها یآن اضافه شده است و شما کافی است فارسی را نتخاب کنید) . حال اگر به لیست زبان های خود در Installation Localization نگاه کنید خواهید دید که زبان فارسی اضافه شده است . در Installation Designer قسمت User Interface بر روی Dialog کلیک کنید . اگر روی هر دیالوگ کلیک کنید خواهید دید که زبان فارسی در آنجا وجو دارد که با انتخاب هر آیتم و تغییر متن خصوصیت text به فارسی می توانید تمام پنجره های خود را فارسی کنید .

یک روش دیگر استفاده از تصاویر با پسوند BMP است که این عمل هم تنها در حالت Basic MSI Project درست عمل می کند . اما مزیت این روش این است که می توانید فرم های خود را به صورت دلخواه طراحی کنید برای تغییر زمینه دکمه ها هم باید خصوصیت Control Style آن را به Bitmap و یا Icon تغییر دهید .

روش دوم :

در زمان ایجاد پروژه بر روی Installscript Project کلیک کنید . در اینجا دیگر قادر نیستید در طراحی فارسی تایپ کنید اما با کد نویسی این امکان برای شما وجو دارد . در قسمت Installation Designer بر روی Behavior and Logic گزینه Installscript را انتخاب کنید . حال با توجه به دیالوگ هایی که مورد نیاز دارید و در حین نصب استفاده می کنید که بیشتر این دیالوگ ها خود در صورت عبور از تمامی مراحل در اینجا قرار میگیرند و با تغییر دو لیست باکس بالای صفحه می توانید رویدادهای را که می خواهید اتفاق افتند را انتخاب کنید . حالا هرجاییی که متنی قرار گرفته است را با متن فارسی خود جایگزین کنید . که در زیر کد دیالوگ welcom را به عنوان نمونه قرار داده ام . که به جای متن فارسی قبلا szTitle و szMsg وجود داشته است .


Dlg_SdWelcome:

szTitle = "";

szMsg = "";

//{{IS_SCRIPT_TAG(Dlg_SdWelcome)

nResult = SdWelcome("به برنامه نصب خوش آمدید" ,"نرم افزار بر روی سیستم شما نصب خواهد شد " );

//}}IS_SCRIPT_TAG(Dlg_SdWelcome)

if (nResult = BACK) goto Dlg_Start;



4-اسکریپت برگشت مقادیر از رجیستری ویندوز
با کد زیر شما می توانید نوع سیستم عامل خود را تشخیص دهید .


RegDBSetDefaultRoot (HKEY_LOCAL_MACHINE);

RegDBGetKeyValueEx ("\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\", "ProductName", nvType, svNumValue,nvSize) ;

که در ابتدا مسیر و نام را مشخص می کنیم و بعد با استفاده از 3 متغیر نوع ، مقدار و سایز مقدار را بر می گردانیم . که با تغییر در کد می توانید مقادیر دلخواه خود را بر گردانید .
با دستورات زیر کارهایی نظیر ایجاد ، حذف ، کپی و ... را نیز می توانید انجام دهید .
RegDBCreateKeyEx
RegDBDeleteKey
RegDBGetKeyValueEx
RegDBCopyValues
...

magz_sr
شنبه 14 شهریور 1388, 03:48 صبح
لطفا در مورد گذاشتن پسورد که هنگام نصب گرسیده میشود نیز توضیح دهید
ممنون

baran_2005
شنبه 21 شهریور 1388, 11:41 صبح
لطفا در مورد گذاشتن پسورد که هنگام نصب پرسیده میشود نیز توضیح دهید
ممنون


با استفاده از دستور RegDBCreateKeyEx می توانید کلید مورد نظر خود را در مسیر دلخواه رجیستری ایجاد کنید و سپس مقدار فیلد خود را با مقدار دلخواه پر کنید که در قسمت اضافه کردن الیاس توضیح داده شده است . با توضیحات داده شده و با توجه به help داخل installshield اگر توجه کنید حتما به نتیجه می رسید.


/*--------------------------------------------------------------*\
*
* InstallShield Example Script
*
* Demonstrates the RegDBCreateKeyEx and RegDBKeyExist functions.
*
* First, RegDBCreateKey is called to create a subkey with no
* class value in the HKEY_CLASSES_ROOT key. Then, RegDBKeyExist
* is then called to check if the key was created.
*
* RegDBCreateKey is called again to create a multi-level subkey
* with a class value associated with it under HKEY_CLASSES_ROOT.
* Then RegDBKeyExist is called again to check for the existence
* of the new key.
*
\*--------------------------------------------------------------*/

#define TITLE_TEXT "RegDBCreateKeyEx & RegDBKeyExist"

// Include Ifx.h for built-in InstallScript function prototypes.
#include "Ifx.h"

export prototype ExFn_RegDBCreateKeyEx(HWND);

function ExFn_RegDBCreateKeyEx(hMSI)
STRING szKey, szClass, szKeyRoot, szMsg, svLogFile;
NUMBER nResult1, nResult2;
begin

// Create a key with no class value.
szKey = "CreateKeyExample";
szClass = "";

if (RegDBCreateKeyEx(szKey, szClass) < 0) then
MessageBox ("First call to RegDBCreateKeyEx failed.", SEVERE);
abort;
else
SprintfBox (INFORMATION, TITLE_TEXT, "Successfully created: %s", szKey);

// Check to see if the key just created exists.
if (RegDBKeyExist (szKey) < 0) then
MessageBox ("First call to RegDBKeyExist failed.", SEVERE);
else
SprintfBox (INFORMATION, TITLE_TEXT, "%s exists.", szKey);
endif;
endif;

if (RegDBDeleteKey (szKey) < 0) then
MessageBox ("RegDBDeleteKey failed.", SEVERE);
endif;

// Create a key with more than one sublevel and a class value.
szKey = "ShareWare\\Games\\CoolChess";
szClass = "LastPlayed";
szKeyRoot = "ShareWare";

if (RegDBCreateKeyEx(szKey, szClass) < 0) then
MessageBox ("Second call to RegDBCreateKeyEx failed.", SEVERE);
abort;
else
SprintfBox (INFORMATION, TITLE_TEXT, "Successfully created: %s", szKey);

// Check if the newly created multi-level key exists.
if (RegDBKeyExist (szKeyRoot) < 0) then
MessageBox ("Second call to RegDBKeyExist failed.", SEVERE);
else
SprintfBox (INFORMATION, TITLE_TEXT, "%s exists.", szKey);
endif;
endif;

if (RegDBDeleteKey (szKey) < 0) then
MessageBox ("RegDBDeleteKey failed.", SEVERE);
endif;

end;

mehdi_naghdi
یک شنبه 22 شهریور 1388, 15:19 عصر
شرمنده تو تاپيك خودم جواب ندادي اينجا سئوالمو مي پرسم.
واسه پروژه‌اي كه با C#‎ , كريستال ريپورت , SQL Server 2000 نوشته شده مي خوام با InstallShield2009 فايل SetUp f بسازم.
1. چه فايل هايي رو تو قسمت Application Files بايد Add كنم؟
2. تو قسمت Application Redistributables وقتي تيك Crystal report رو ميزنم بعدش تو پنجره هاي بعدي بايد چكار كنم؟
3. تو قسمت Application Redistributables وقتي تيك SQL Server 2000 رو ميزنم بعدش تو پنجره هاي بعدي بايد چكار كنم؟

shima818
دوشنبه 27 مهر 1388, 10:40 صبح
سلام
من با استفاده از روش اول دیالوگ های فارسی را اضافه کردم و زبان فارسی را زبان پیش فرض کردم ولی باز هم دیالوگ انگلیسی نمایش داده می شود.
چه تنظیمی باید انجام دهم؟

ساراساراسارا
پنج شنبه 30 مهر 1388, 13:25 عصر
شرمنده دوست عزيز، من اين سوال رو خيلي وقت است که پرسيدم، ولي جوابي نگرفتم به همين دليل با خوندن مطالب خوبتون،تصميم گرفتم سوالمو اينج مطرح کنم. اميدوارم اينجا به جوابي برسم.
من در ديتا بيسم يک جدول دارم که آدرس سرويس ها در آن نگهداري مي شود، بعد از نصب پروژه کاربر بايد در داخل جدول آدرس اين سرويس هارو با توجه به نام سرورتغيير دهد، حالا من مي خوام کاربر بدون دسترسي مستقيم به جدول اين کارو انجام بده . به فرض وقتي در TextBox يک ديالوگ نام سرور را وارد کرد، من اين مقدار ورودي را چه طور بگيرم و چگونه در ديتابيس تغيير دهم ؟

baran_2005
شنبه 23 آبان 1388, 14:55 عصر
سلام
من با استفاده از روش اول دیالوگ های فارسی را اضافه کردم و زبان فارسی را زبان پیش فرض کردم ولی باز هم دیالوگ انگلیسی نمایش داده می شود.
چه تنظیمی باید انجام دهم؟

دوست گرامی شما حتما زبان پیش فرضتون انگلیسی در قسمت general information بر روی زبان فارسی راست کلیک و make default را بزنید

baran_2005
شنبه 23 آبان 1388, 15:03 عصر
شرمنده دوست عزيز، من اين سوال رو خيلي وقت است که پرسيدم، ولي جوابي نگرفتم به همين دليل با خوندن مطالب خوبتون،تصميم گرفتم سوالمو اينج مطرح کنم. اميدوارم اينجا به جوابي برسم.
من در ديتا بيسم يک جدول دارم که آدرس سرويس ها در آن نگهداري مي شود، بعد از نصب پروژه کاربر بايد در داخل جدول آدرس اين سرويس هارو با توجه به نام سرورتغيير دهد، حالا من مي خوام کاربر بدون دسترسي مستقيم به جدول اين کارو انجام بده . به فرض وقتي در TextBox يک ديالوگ نام سرور را وارد کرد، من اين مقدار ورودي را چه طور بگيرم و چگونه در ديتابيس تغيير دهم ؟

برای دریافت یک مقدار از ورودی که من در تاپیک اول توضیح دادم در مورد ارتباط با sql یک کد به عنوان نمونه قرار می دهم امیدوارم مورد استفاده قرار بگیرد .


function ExecuteSQLScript2(szServer, szUser, szPassword, szDBName)

OBJECT oCon, oCommand;
STRING sSQL, sConnection;
STRING sError, sErrorNumber;
NUMBER nError;

begin
try
sConnection = "Provider=SQLOLEDB.1;Password=" + szPassword + ";Persist Security Info=True;User ID=" + szUser + ";Initial Catalog=" + szDBName + ";Data Source=" + szServer;
set oCon = CoCreateObject("ADODB.Connection");
oCon.Open(sConnection);
set oCommand = CoCreateObject("ADODB.Command");
oCommand.ActiveConnection = oCon;

if str_xsystem="1" then

//SdShowMsg ("Attaching Database " + sDatabase, TRUE);

sSQL ="UPDATE xsystems SET XSS1201= 1 ";

//Display Message
oCommand.CommandText = sSQL;
oCommand.Execute();
else
if n_stock ="1" then
sSQL ="UPDATE xsystems SET XSS1201= 1 where XSS0101=11";
oCommand.CommandText = sSQL;
oCommand.Execute();
endif;


endif ;
oCon.Close();
catch
nError = Err.Number;
sError = Err.Description;
NumToStr (sErrorNumber, nError);
//MessageBox ("Attach Database Error: " + sErrorNumber+ " Description: " + sError,SEVERE);
//SdShowMsg ("Attaching Database " + sDatabase, FALSE);
//return FALSE;
endcatch;
end;

baran_2005
شنبه 23 آبان 1388, 15:05 عصر
در زیر دو تابع برای attach و detach بانک قرار دادم

///////////////////detach /////
// //
///////////////////////////////////////
function BOOL DetachSQLDatabase( sServer, sDatabase, sUser, sPassword)
OBJECT oCon, oCommand;
STRING sSQL, sConnection;
STRING sError, sErrorNumber;
NUMBER nError;
begin
try
SdShowMsg ("Detaching Database " + sDatabase, TRUE);
sConnection = "Provider=SQLOLEDB.1;Password=" + sPassword + ";Persist Security Info=True;User ID=" + sUser + ";Initial Catalog=" + "Master" + ";Data Source=" + sServer;
set oCon = CoCreateObject("ADODB.Connection");
oCon.Open(sConnection);
set oCommand = CoCreateObject("ADODB.Command");
oCommand.ActiveConnection = oCon;
sSQL = "sp_detach_db '" + sDatabase + "', '" + "true'";
//Display Message
oCommand.CommandText = sSQL;
oCommand.Execute();
oCon.Close();
SdShowMsg ("Detaching Database " + sDatabase, FALSE);
return TRUE; //Return Value
catch
nError = Err.Number;
sError = Err.Description;
NumToStr (sErrorNumber, nError);
// MessageBox ("Detach Database Error: " + sErrorNumber+ " Description: " + sError,SEVERE);
SdShowMsg ("Detaching Database " + sDatabase, FALSE);
return FALSE;
endcatch;
end;
//////////////////////////////////////////////////////////////////////////////
// Function: AttachSQLDatabase
// Description: Attaches a SQL database to the specified server
//
//////////////////////////////////////////////////////////////////////////////

function BOOL AttachSQLDatabase(sDataFile, sLogFile, sServer, sDatabase, sUser, sPassword)
OBJECT oCon, oCommand;
STRING sSQL, sConnection;
STRING sError, sErrorNumber;
NUMBER nError;

begin
try
SdShowMsg ("Attaching Database " + sDatabase, TRUE);
sConnection = "Provider=SQLOLEDB.1;Password=" + sPassword + ";Persist Security Info=True;User ID=" + sUser + ";Initial Catalog=" + "Master" + ";Data Source=" + sServer;
set oCon = CoCreateObject("ADODB.Connection");
oCon.Open(sConnection);
set oCommand = CoCreateObject("ADODB.Command");
oCommand.ActiveConnection = oCon;
sSQL = "sp_attach_db '" + sDatabase + "', '" + sDataFile +"','" + sLogFile + "'";
//Display Message
oCommand.CommandText = sSQL;
oCommand.Execute();

oCon.Close();
SdShowMsg ("Attaching Database " + sDatabase, FALSE);
return TRUE; //Return Value
catch
nError = Err.Number;
sError = Err.Description;
NumToStr (sErrorNumber, nError);
MessageBox ("Attach Database Error: " + sErrorNumber+ " Description: " + sError,SEVERE);
SdShowMsg ("Attaching Database " + sDatabase, FALSE);
return FALSE;
endcatch;
end;

/* Change Instance Name Function //
// ///
*/

function ChangeInstanceName(Name)
object oObject;
string szMsg, szStatus;
begin
try
set oObject = GetObject("New MSDE 2000 Object 1");
if (!IsObject(oObject)) then
MessageBoxEx("Failed to get object reference.", "", INFORMATION);
abort;
endif;
oObject.InstanceName = Name;

catch
Sprintf( szStatus, "Unexpected Exception\n\nNumber: 0X%X\nDescription:" +
"%s\nSource: %s\nHelp File: %s\nHelp Context: %d", Err.Number,
Err.Description, Err.Source, Err.HelpFile, Err.HelpContext);
MessageBoxEx( szStatus, "", SEVERE );
abort;
endcatch;
str_instansename1=Name;
end;

baran_2005
شنبه 23 آبان 1388, 15:06 عصر
از دوستان بابت اینکه دیر پاسخ دادم معذرت خواهی می کنم