阅读:1611回复:1
如何在InstallShield中使用自己的DLL
<CENTER><FONT color=#0000c0>
<H2></FONT> </H2></CENTER> <P><FONT color=#ffffff>----</FONT> 作为一个开发人员,当我们为用户开发好应用系统时,就要包装分发自己的程序给最终用户。一般情况下,相应的开发系统中也提供了相应的分发工具,例如Visual Basic6.0中的 [Package ; Deployment 向导] ,但是有的开发系统提供的都是英文版的,为了适应中国用户,我们需要选择一款易学易用,界面友好的工具软件,而 InstallShield 就是最好的工具之一。在此我选用的是 InstallShield 5.1 远东专业版本,此版本可以制作出支持多种语言界面的安装程序。 <P><FONT color=#ffffff>----</FONT> InstallShield 的功能相当强大,能够对系统和安装需要提供丰富的函数支持,有足够灵活的界面控制支持,而且其脚本语言特点与Visual C++的代码极其相似,非常适合使用Visual C++的开发者使用。 <P><FONT color=#ffffff>----</FONT> 但是,在某些情况下,InstallShield不能提供能完成某种特殊功能的相应函数,这时需要我们自己开发出能够完成此功能的函数,然后放在InstallShield中调用,达到与其完美的结合,DLL是最佳的选择。 <P><FONT color=#ffffff>----</FONT> 本文以一个实例介绍了如何生成自己的DLL,以及如何在 InstallShield中调用。 <P><FONT color=#a30004>一、制作DLL:</FONT> <P><FONT color=#ffffff>----</FONT> 此动态库函数主要是显示出传给自己的字符串,并做了改动返回(如果要在InstallShield中使用改动过的字符串,在InstallShield中原型声明时,用POINTER对应LPSTR),并且根据传入的数据返回不同的返回值,用户只要根据此原理实现自己的函数即可: <P><FONT color=#ffffff>----</FONT> 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函数例码: <PRE>int CSetup00App::Test(LPSTR lpszStr, int iVal) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); AfxMessageBox(lpszStr); //如果想改变字符串,用下面方法 strcpy(lpszStr,_T("动态库已经变了字符串")); if (iVal == 1) return 1; else return 2; } </PRE><FONT color=#ffffff>----</FONT> 2、在FileView中,从Source Files中双击 Setup00.def,在代码; Explicit exports can go here的下一行输入: Test @1 <P><FONT color=#ffffff>----</FONT> 3、选择成Release版本,从 Build 菜单上选择 Build Setup00.dll即可。 <P><FONT color=#a30004>二、在 InstallShield 中使用实例:</FONT> <P><FONT color=#ffffff>----</FONT> 1、在 Setup Files Pane 中的 Language Independent\Operating System Independent下用 Insert Files 命令添入 Setup00.dll 。这样,你的动态库就可以在制作安装盘时被压入 _user1.cab 中, <P><FONT color=#ffffff>----</FONT> 如果你没有把DLL放至_user1.cab中,你可以把DLL和你的应用程序放到一块,然后从目标系统中调用。但是,如果你已经做了,你必须指明你要使用的DLL的位置以使安装程序能够找到。而且你必须确信在调用DLL之前它已经被拷贝到预定目录之下。 <P><FONT color=#ffffff>----</FONT> 2、在脚本程序的程序段中,添加下面代码: <PRE> // 声明setp00.dll中的Test函数原型: prototype INT Setup00.Test( STRING,INT); </PRE><FONT color=#ffffff>----</FONT> //如果想要在DLL中改变字符串值,需要将STRING声明成按指针传递,如下: <PRE> //prototype INT Setup00.Test( BYREF STRING,INT); STRING szDLL, svString; INT nValue; POINTER psvString; BOOL bDone; NUMBER nResult; program szDLL = DLL_FILE; /*--------------------------------------*\ * Load SETUP00.DLL into memory. \*--------------------------------------*/ 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; </PRE><FONT color=#a30004>三、请使用下面参数类型对照表,在原型声明和外部函数之间进行数据类型匹配。</FONT> <P><IMG src="http://ourcode.net/vc/vckbase/article/dll/062702-03.jpg"> <P><FONT color=#ffffff>----</FONT> 在安装程序调用动态库函数时需要遵循三个规则: <P><FONT color=#ffffff>----</FONT> 1、动态库函数的名字最长为33个字符;InstallShield函数名最长为80个字符。 <P><FONT color=#ffffff>----</FONT> 2、InstallShield在调用DLL时,不能接受组合参数(就是说一个大于由个字节的参数),然而参数可以是一个指向组合结构的指针。 <P><FONT color=#ffffff>----</FONT> 3、在16位平台上应调用16位DLL;而在32位平台上应调用32位DLL。 <P><FONT color=#ffffff>----</FONT> 本例在 WIN98,Visual C++5.0,Visual C++6.0,InstallShield5.1中调用通过。 </P> |
|
|
1楼#
发布于:2004-11-19 21:53
好东西<img src="images/post/smile/dvbbs/em02.gif" />
|
|