InstallShield有關的摘錄

1.如何獲得安裝目標盤剩餘空間:

//用prototype關鍵字聲明函數
prototype CheckDiskSpace();  
//常量定義:其中#define是宏定義命令,它的作用是將TARGETDISK用DISK_DRIVE來代替;DISK_DRIVE稱爲宏名
#define DISK_DRIVE TARGETDISK
  
function CheckDiskSpace() 

//變量申明
    STRING szDrive,svString;
    NUMBER nSpace,nResult; 

2. 在非Web Project工程中,如何用簡單的方法實現安裝時IIS的檢測(適用於ISX,10.5,11,11.5):

新建一個Web Project,切換到Installation Designer->System search處,在右邊的列表中右擊,選擇publish Wizard(發佈嚮導),按嚮導提示進行發佈。

3.運行其他安裝程序:

可以在主安裝程序下運行其他的安裝程序。在選擇的每個子安裝程序都運行完畢後,主安裝程序纔會結束運行。有兩種方法可以實
現這一功能:
    1.調用Dolnstall
    啓動由InstallShield生成的安裝程序的較好的辦法是如下調用DoInstall函數:
   (1)爲要啓動的子安裝程序建立一個完整的安裝工程;所有由InstallShield生成的文件
對子安裝程序的正常運行都是必需的。
    (2)在已啓動的主安裝工程中,把所有爲子安裝程序生成的文件放在Setup Files面板
下適當的surportfiles文件夾中。
     提示:給子安裝程序的setup.inx一個區別於setup.inx的文件名。
   (3)在父安裝腳本調用DoInstall函數。
    例如:

DoInstall (SUPPORTDIR^"child.inx""", WAIT);

4.創建internet快捷方式:

實現方法:隨便建一個快捷方式:修改剛剛添加的快捷方式的屬性,主要修改Target和Arguments兩項。將Target的內容改爲[ProgramFilesFolder]Internet Explorer/IEXPLORE.EXE,即將快捷方式指向IE,然後將Arguments修改爲網址,不過在installscript可以直接建internet快捷方式了,不知爲什麼其他工程卻無此功能。

5.怎麼在安裝時不顯示當前正在複製的文件名:

方法很簡單,只用在Dlg_sdStart Copy對話框的reture 0;前加上以下語句:Disable(INDVFILESTATUS);//用於控制進度條左上當前安裝文件顯示與否;

6.可以在script編輯界面按下Ctrl+I鍵打開函數嚮導對話框

7.怎樣設置安裝協議

在Installation Designer頁面:Bahavior and Logic->Support Files面板中,在合適的目標語言和平臺下放置license文件。然後在installscript處修改Dlg_SdLicense對話框對安裝協議的調用腳本。Dlg_SdLicense:   //閱讀安裝協議。

   szLicenseFile = SUPPORTDIR ^ "license.txt";
    szTitle    
= "";
    szMsg      
= "";
    szQuestion 
= "";
    nResult    
= SdLicense( szTitle, szMsg, szQuestion, szLicenseFile );
    
if (nResult = BACK) goto Dlg_SdWelcome; 

8.IS中調用DLL的問題解決過程

原文出處:InstallShield 中文論壇
原文地址:http://installshield.jaron.cn/forum/dispbbs.asp?boardID=3&ID=285266&page=1
原文作者:upselfever

背景:要求軟件在安裝時驗證授權號,並且一個授權號只能在一臺機器上使用。
解決方法:安裝時讀取機器的硬件ID(CPU),根據硬件ID計算生成授權號。安裝時檢測用戶輸入的授權號,和計算生成的授權號是否一致。
技術實現:通過VC++編寫DLL,提供兩個接口函數,GetCPU_ID(),GetSerialNumber().然後在IS中加載這個DLL,然後調用這兩個函數取得CPU的ID,然後生成合法授權號。
遇到的問題:加載開發人員提供的DLL,成功。但是在調用DLL提供的函數,IS報出0x80040703的錯誤:提示找不到上述的兩個函數。
解決過程:由於在IS中調用dll並使用其中的函數,這個過程沒有什麼變化,所以,問題就定位在DLL上面。下面簡述在IS中加載DLL的方法。

              首先:將DLL文件添加在IS的SUPPORTDIR目錄下,就是許可協議文件放的那個目錄。

              然後:在腳本文件的開頭聲明兩個函數

                         prototype NUMBER MyDLL.GetCPU_ID();

                         prototype NUMBER MyDLL.GetSerialNumber(NUMBER);

              其次:我在function中開始加載DLL

                         nResult=UseDLL(SUPPORTDIR^MyDLL.dll);

                         判斷nResult的值來看看是否加載成功,如果加載成功則

                         nCPUID=GetCPU_ID();   結果就在這個地方,報出了無法找到MyDLL.GetCPU_ID函數的錯誤。

以上的文件加載和函數聲明調用過程很容易從IS的幫助文檔中找到,或者從網上搜的到。應該不會有太大問題。問題肯定出在了DLL上。

-------dll部分修改過程-------------

        原DLL中,函數聲明格式如下:

        extern "C" _declspec(dllexport) int GetCPU_ID();

        extern "C" _declspec(dllexport) int GetSerialNumber(int cpu_id);

後經過若干查找,諮詢,改爲:
        
        extern "C" _declspec(dllexport)  int __stdcall  GetCPU_ID(); //標準調用

        extern "C" _declspec(dllexport) int __stdcall  GetSerialNumber(int cpu_id);

並使用.def文件,定義接口函數的名稱

LIBRARY MyDLL

        EXPORTS
        GetCPU_ID
        GetSerialNumber

如此,再編譯生成MyDLL.dll文件

--------i修改過程-------------------

修改IS中函數聲明
        
          prototype stdcall NUMBER MyDLL.GetCPU_ID();

          prototype stdcall NUMBER MyDLL.GetSerialNumber(NUMBER);


          .....

          function ******()
          
          number  nCPUID;
          ..........


          begin

             nResult=UseDLL(SUPPORTDIR^MyDLL.dll);
             if nResult=0 then
             MessageBox("動態庫加載成功",INFORMATION);
             nCPUID=GetCPU_ID();
             .....
          else
             MessageBox("動態庫加載失敗",INFORMATION);
             abort;
          endif
          ....
          end


成功!!!

-----提醒-----------------

根據在其它論壇搜索到的知識,如果動態庫是用VB或其它工具開發的,則調用方法又不相同。

用VC++開發的動態庫在函數聲明使,光使用extern "C"關鍵字是不夠的,這樣只是保證了用C可以正確調用,而用其它工具,比如DELPHI就不可以。還要使用DEF文件,對函數名稱進行聲明。

關於是否必須使用stdcall關鍵字,我沒有進行試驗,但是,使用這個關鍵字,是可以成功調用的。

具體動態庫的知識,由於本人不是程序員,不能保證說明正確,只保證結果正確。

 

 

尊重他人勞動成果,轉載請註明出處

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章