//用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函數。
例如:
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: //閱讀安裝協議。
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關鍵字,我沒有進行試驗,但是,使用這個關鍵字,是可以成功調用的。
具體動態庫的知識,由於本人不是程序員,不能保證說明正確,只保證結果正確。
尊重他人勞動成果,轉載請註明出處