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的方法最灵活,方便.