李晓亮的博客

导航

【转】如何在InstallShield中使用自己的DLL

---- 作为一个开发人员,当我们为用户开发好应用系统时,就要包装分发自己的程序给最终用户。一般情况下,相应的开发系统中也提供了相应的分发工具,例如Visual Basic6.0中的 [Package & Deployment 向导] ,但是有的开发系统提供的都是英文版的,为了适应中国用户,我们需要选择一款易学易用,界面友好的工具软件,而 InstallShield 就是最好的工具之一。在此我选用的是 InstallShield 5.1 远东专业版本,此版本可以制作出支持多种语言界面的安装程序。

---- 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;
/*--------------------------------------*\
* 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;
三、请使用下面参数类型对照表,在原型声明和外部函数之间进行数据类型匹配。

---- 在安装程序调用动态库函数时需要遵循三个规则:

---- 1、动态库函数的名字最长为33个字符;InstallShield函数名最长为80个字符。

---- 2、InstallShield在调用DLL时,不能接受组合参数(就是说一个大于由个字节的参数),然而参数可以是一个指向组合结构的指针。

---- 3、在16位平台上应调用16位DLL;而在32位平台上应调用32位DLL。

---- 本例在 WIN98,Visual C++5.0,Visual C++6.0,InstallShield5.1中调用通过。

posted on 2010-10-11 00:05  LeeXiaoLiang  阅读(369)  评论(0编辑  收藏  举报