InstallShield如何调用c++的dll

  
  1 用c++ 6 新建一个非mfc的dll工程sss,选择生成“a symbol that exports some symbols”
  
  2 在sss.h的最后加入以下代码
  
  extern "C"  __declspec(dllexport)  int _cdecl MyDllFunc(int a);
  
  3 在sss.cpp的最后加入以下代码:
  
  int MyDllFunc(int a)
  {
          return a * 10;
  }
  
  然后生成dll
  
  4 InstallShield DevStudio 9 里新建一个工程,找到它的script选项,在默认的setup.rul里输入以下代码:
  
  #include "Ifx.h"     
  #include "dll.rul" 
  
  
  function OnBegin()
      STRING  szTitle, szMsg, svName, svCompany, svSerial;
      LIST    listData;
  begin
  
      listData = ListCreate (STRINGLIST);
      szTitle = "SdRegisterUserEx Example";
      szMsg   = "Please enter your name, company, and serial number.";
     
      SdRegisterUserEx (szTitle, szMsg, svName, svCompany, svSerial);
     
             
      ExFn_UseDLL(StrLength(svSerial));   
  
      ListAddString (listData, "User Information: ", AFTER);
      ListAddString (listData, "          " + svName, AFTER);
      ListAddString (listData, "          " + svCompany, AFTER);
      ListAddString (listData, "          " + svSerial, AFTER);
      ListAddString (listData, "", AFTER);  
     
      szMsg   = "The user name, company name, and serial number " +
                        "entered in SdRegisterUserEx.";
      SdShowInfoList(szTitle, szMsg, listData);
  
  end;
  
  5 现在建立一个新的脚本文件,命名为"dll.rul",这个脚本被上面的代码引用,我们的dll处理代码将建立在这里,在它里面输入以下代码:
  
  
  
  #define DLL_FILE  SUPPORTDIR ^ "sss.dll"
  #include "Ifx.h"
  
  
      prototype cdecl sss.MyDllFunc(int);
      export prototype ExFn_UseDLL(int);
  
  function ExFn_UseDLL(strLength)
      STRING  svString,pppstring;
      INT     nValue;
      INT     nReturnInt ;
      POINTER psvString;
      NUMBER  nResult;
      BOOL    bDone;
  begin
  
      nResult = UseDLL (DLL_FILE);
  
      if (nResult = 0) then
          MessageBox ("UseDLL successful /n/n.DLL file loaded.", INFORMATION);
      else
          MessageBox ("UseDLL failed./n/nCouldn't load .DLL file.", INFORMATION);
          abort;
      endif;
  
      bDone = FALSE;
  
      while (bDone = FALSE)
          Disable (BACKBUTTON);
  
          AskText ("Enter an example string.", "Example string.", svString);
  
          nValue = StrLength (svString);
  
          nReturnInt = NumToStr(pppstring,MyDllFunc(nValue));   
         
          SprintfBox (INFORMATION, "UseDLL", "MydllReturn() changed the string " + "to: %s", pppstring);
  
          if (AskYesNo ("Do another example?", YES) = NO) then
              bDone = TRUE;
          endif;
      endwhile;
  
      if (UnUseDLL (DLL_FILE) < 0) then
          MessageBox ("UnUseDLL failed./n/nDLL still in memory.", SEVERE);
      else
          MessageBox ("UnUseDLL successful./n/n.DLL file removed from memory.",
                     INFORMATION);
      endif;
  
  end;
  
  
  上面的代码作了几件事,首先:
  
  #define DLL_FILE  SUPPORTDIR ^ "sss.dll" 这个规定dll的路径
  
  prototype cdecl sss.MyDllFunc(int);这句声明dll里的MyDllFunc.前面的sss是必要的,与dll默认的生成名必须一致.cdecl关键字必须要,否则会产生运行错误.
  
  export prototype ExFn_UseDLL(int);这句是声明被setup.rul调用的用户自定义函数
  
  以上代码输入后,在support files里加上我们刚刚生成的dll以便installshield知道如何引用.
  
  6 现在build这个工程.运行,可以调用dll的函数了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值