gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
阅读:1612回复:1

如何在InstallShield中使用自己的DLL

楼主#
更多 发布于:2004-11-15 20:07
<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>
喜欢0 评分0
GIS麦田守望者,期待与您交流。
haozi4272
路人甲
路人甲
  • 注册日期2004-11-13
  • 发帖数49
  • QQ
  • 铜币161枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2004-11-19 21:53
好东西<img src="images/post/smile/dvbbs/em02.gif" />
举报 回复(0) 喜欢(0)     评分
游客

返回顶部