您的位置:首页 > 编程语言 > C语言/C++

InstallShield如何调用c++的dll

2009-03-14 13:59 302 查看
教程
  
  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的函数了.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: