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

InstallShield如何调用c++的dll

2010-10-20 18:35 281 查看
  

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