install sheild调用外部函数(在dll内)

好久没有来写点东西了,不过最近慢的晕头转向. 今天就写一点IS(install sheild)调用外部函数的东西吧.
我们的项目是这样的,软件的序列号和注册码是写在加密狗里面的, 在安装的时候判断用户输入的序列号注册码是否跟狗内的一致,如果一致可以容许继续安装,如果不一致就要退出. 读取狗内的信息,并判断是否一致的方法是写在一个dll内的函数中.

最初这个dll是用vb做的. 不过vb做的dll好像没有 Export的功能,其外部其他程序是无法调用的,所以后来改用 vc++来处理. 以下是IS中调用这个函数的具体方法:

1.在IS的开头声明dll内函数的原型
prototype cdecl INT InstallDoggyCheck.GetVersionFlag (BYREF string);
prototype cdecl INT InstallDoggyCheck.GetRegCodeFlag(BYREF string,BYREF string);

2.   拷贝加密狗的动态链接库
     SetFileInfo (SUPPORTDIR ^ "Rockey2.dll", FILE_ATTRIBUTE, FILE_ATTR_NORMAL, "");
     //SetFileInfo (SUPPORTDIR ^ "InstallDoggyCheck.dll", FILE_ATTRIBUTE, FILE_ATTR_NORMAL, "");
     CopyFile (SUPPORTDIR ^ "Rockey2.dll",WINDIR ^ "SYSTEM32\\Rockey2.dll"); 
     CopyFile (SUPPORTDIR ^ "Rockey2.lib",WINDIR ^ "SYSTEM32\\Rockey2.lib"); 

3.动态载入含有函数的dll(就是用vc++写的那个)
szDLL = SUPPORTDIR ^ "InstallDoggyCheck.dll";
  nResult = UseDLL (szDLL);
  if (nResult = 0) then
   //MessageBox ("动态库调入内存成功!", INFORMATION);
  else
   MessageBox ("动态库调入内存失败!", INFORMATION);
   abort;
  endif;

4.调用dll内的函数
nResult = InstallDoggyCheck.GetVersionFlag(svEdit1);
  //NumToStr (svString, nResult);
  //MessageBox(svString,SEVERE);
  if(nResult!=1) then
   MessageBox("请确定你是否正确地安装了加密狗输入了序列号!",SEVERE);
   glSNNum= glSNNum+ 1;
   if(glSNNum<=3) then
    goto Dlg_AskSN;
   else
    abort;
   endif;
  endif;
5.卸载dll
if (UnUseDLL (szDLL) < 0) then
   MessageBox("卸载动态库失败,仍在内存中!", SEVERE);
  else
   //MessageBox("从内存中卸载动态库成功!", INFORMATION);
  endif;

说明:1. 声明原型 函数调用部分dll的名字必须 与实际dll的名字完全对应,包括大小写.
        2. 在IS和vc++中传递参数. IS中的sting,要对应vc++中的LPSTR,(不可以对应
char*等其他类型).

        3.IS中调用外部函数 还有其他方法,不过这个动态载入卸载dll的方法最灵活,方便.

posted on 2004-11-09 09:40  追忆似水年华  阅读(1283)  评论(0编辑  收藏  举报

导航