天天看點

InstallShield

InstallShield 的功能相當強大,能夠對系統和安裝需要提供豐富的函數支援,有足夠靈活的界面控制支援,而且其腳本語言特點與Visual C++的代碼極其相似,非常适合使用Visual C++的開發者使用。

---- 但是,在某些情況下,InstallShield不能提供能完成某種特殊功能的相應函數,這時需要我們自己開發出能夠完成此功能的函數,然後放在InstallShield中調用,達到與其完美的結合,DLL是最佳的選擇。

---- 本文以一個執行個體介紹了如何生成自己的DLL,以及如何在 InstallShield中調用。

一、制作DLL:

---- 此動态庫函數主要是顯示出傳給自己的字元串,并做了改動傳回(如果要在InstallShield中使用改動過的字元串,在InstallShield中原型聲明時,用POINTER對應LPSTR),并且根據傳入的資料傳回不同的傳回值,使用者隻要根據此原理實作自己的函數即可:

---- 1、在Visual C++中的 New 中選擇 MFC AppWizard(DLL) 工程類型,輸入工程名Setup00,點OK,直接 Finish 即可。然後在ClassView中,用滑鼠右擊Csetup00App,選擇Add Member Function…,在Function Type中輸入int,在Function Declaration中輸入Test(LPSTR lpszStr, int iVal),Access類型選擇Public,然後輸入下面函數體。 Setup00.DLL的Test函數例碼:

int CSetup00App::Test(LPSTR lpszStr, int iVal)

{

   AFX_MANAGE_STATE(AfxGetStaticModuleState());

   AfxMessageBox(lpszStr);

   //如果想改變字元串,用下面方法

   strcpy(lpszStr,_T("動态庫已經變了字元串"));

   if (iVal == 1)

       return 1;

   else

       return 2;

}

---- 2、在FileView中,從Source Files中輕按兩下 Setup00.def,在代碼; Explicit exports can go here的下一行輸入: Test @1

---- 3、選擇成Release版本,從 Build 菜單上選擇 Build Setup00.dll即可。

二、在 InstallShield 中使用執行個體:

---- 1、在 Setup Files Pane 中的 Language Independent\Operating System Independent下用 Insert Files 指令添入 Setup00.dll 。這樣,你的動态庫就可以在制作安裝盤時被壓入 _user1.cab 中,

---- 如果你沒有把DLL放至_user1.cab中,你可以把DLL和你的應用程式放到一塊,然後從目标系統中調用。但是,如果你已經做了,你必須指明你要使用的DLL的位置以使安裝程式能夠找到。而且你必須确信在調用DLL之前它已經被拷貝到預定目錄之下。

---- 2、在腳本程式的程式段中,添加下面代碼:

  // 聲明setp00.dll中的Test函數原型:

  prototype INT Setup00.Test( STRING,INT);

---- //如果想要在DLL中改變字元串值,需要将STRING聲明成按指針傳遞,如下:

//prototype INT Setup00.Test( BYREF STRING,INT);

  STRING szDLL, svString;

  INT   nValue;

  POINTER psvString;

  BOOL   bDone;

  NUMBER nResult;

program

  szDLL = DLL_FILE;

  nResult = UseDLL (szDLL);

  if (nResult = 0) then

    MessageBox ("動态庫調入記憶體成功!", INFORMATION);

  else

    MessageBox ("動态庫調入記憶體失敗!", INFORMATION);

    abort;

  endif;

    AskText("請輸入示例字元串:", "這是示例字元串", svString);

    nValue = StrLength(svString);

    nResult = Test(svString,nValue);

    // 顯示調用Setup00.dll中Test函數後的字元串

    SprintfBox(INFORMATION, "調用動态庫", "

    調用後的字元串為:%s ", svString);

if (UnUseDLL (szDLL) < 0) then

           MessageBox("解除安裝動态庫失敗,仍在記憶體中!", SEVERE);

    else

           MessageBox("從記憶體中解除安裝動态庫成功!",

          INFORMATION);

      endif;

原文位址:http://blog.sina.com.cn/s/blog_56f9f160010005ce.html