InstallShield如何调用c++的dll

来源:互联网 发布:三年java面试题 编辑:程序博客网 时间:2024/05/21 00:28

  
  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的函数了.

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 三星s8卡顿严重怎么办 三星s8变卡了怎么办 新开店铺没有人怎么办 电视显示没有usb设备怎么办 华为平板电脑触摸屏没反应怎么办 平板电脑液晶显示屏坏了怎么办 6p的home键失灵怎么办 读书郎屏幕坏了怎么办 苹果平板激活锁忘了怎么办 平板电脑充电插口坏了怎么办? 电视频幕花了怎么办 苹果笔记本电脑硬盘坏了怎么办 mac屏幕压坏了怎么办 新电脑连不上网怎么办 新买电脑后悔了怎么办 装显卡后玩游戏黑屏怎么办 顺丰寄主机坏了怎么办 征信账户忘记了怎么办 疑似qq和疑似应用宝怎么办 荣大3608速印机卸版故障怎么办 配的近视眼镜看不清电脑屏幕怎么办 cad命令反应很慢怎么办 淘宝美工面试让作图怎么办 笔记本玩cf闪退怎么办 台式电脑玩lol卡怎么办 配置充足玩lol卡怎么办 电脑买贵了应该怎么办 微信红包收不了钱怎么办 mac版excel卡死怎么办 锐捷网卡为空怎么办 淘宝上买东西卖家不发货怎么办 快递员没给单号怎么办 淘宝物流把货弄丢了怎么办 刚买的卡没激活怎么办 腾讯王卡40g用完怎么办 手机欠费不知道电话号码怎么办 手机欠费了不用了怎么办 闲鱼恶意差评怎么办 淘宝买家账户体检中心违规怎么办 淘宝卖家账户体检中心违规怎么办 淘宝好评被删除评价怎么办