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

vb、vc++、wincc 调用dll相对应的方法

2011-12-07 10:01 295 查看
首先我们介绍一下vb调用dll的几种方法

一、在vb工程中引用dll

1.在工程-引用中将asdfg.dll引用过来

2.dimccasasdfg'asdfg是类模块的名称PrivateSubForm_Load()dimxSetcc=Newasdfgx=cc.zxc(参数1,参数2)'参数1,

2自己写EndSub建议你了解一下下面dll的制作方法,理解就更透彻了。下面内容来自百度。1.新建一个ActiveXDll,工程名

字为vbmytestdll,类模块名字为mytestdll2.类模块内容只有一个函数,主要返回DLL的HELLOWORLDPublicFunctiondlltest1()AsStringdlltest1="HELLOWORLD"EndFunction3.保存,生成DLL,名字为vbmytestdll.dll4.新建一个EXE工程,在菜单:工程---引用---浏览里找到vbmytestdll.dll,把它引用进来5.EXE工程代码如下:OptionExplicitDimtestdllAsmytestdll'类模块名字PrivateSubForm_Load()Settestdll=Newmytestdll'DLL的一个新实例Me.Caption=testdll.dlltest1'我的标题=返回DLL的HELLOWORLDEndSub

二、在vb工程中写代码动态的把dll引用进去
如下代码

OptionExplicit
'主窗体代码

PrivateDeclareFunctionIsDownLoadLib"DLLDload.dll"(recipenoAsLong,recipenameAsString,lpSetupProgramAsString,strUserAsString,strPwdAsString)AsBoolean


PrivateSubCommand1_Click()
DimaaAsLong
DimbbAsString
DimccAsString
DimddAsString
DimeeAsString
DimffAsBoolean
aa=1
bb="13度"
cc="C:\ProgramFiles"
dd="Admin"
ee="Admin"

ff=IsDownLoad(aa,bb,cc,dd,ee)
EndSub


我们介绍一下VC调用dll的几种方法

一、隐式链接

  隐式链接就是在程序开始执行时就将DLL文件加载到应用程序当中。只要将导入函

数关键字_declspec(dllimport)函数名等写到应用程序相应的头文件中就可以

了。头文件中加入函数

bool_declspec(dllimport)IsDownLoad(longrecipeno,

char*recipename,char*lpSetupProgram,char*strUser,

char*strPwd);.cpp中加入如下代码即可导入lib文件可以在工程中引入,

也可以用代码导入#pragmacomment(lib,"MyDll.lib")在创建.exe文件

之前,要先将.dll和.lib拷贝到当前工程所在的目录下面,

也可以拷贝到windows的System目录下。如果DLL使用的是def文件,

要删除TestDll.h文件中关键字extern"C"。.h文件中的关键字

Progamcommit是要VisualC+的编译器在link时,链接到.lib文件,当然,

开发人员也可以不使用#pragmacomment(lib,"**.lib")语句,

而直接在工程的Setting->Link页的Object/Moduls栏填入MyDll.lib既可。

_declspec(dllimport)boolIsDownLoad(longrecipeno,char*recipename,char*lpSetupProgram,char*strUser,char*strPwd);
voidCAatestDlg::OnButton1()
{

//TODO:AddyourcontrolnotificationhandlercodehereCStringaa;
longbb;
bb=1;
char*aa="13度";
char*cc="C:\\ProgramFiles";
char*dd="Admin";
char*ee="Admin";
if(IsDownLoad(bb,aa,cc,dd,ee))
MessageBox(L"asdf");//TODO:Addyourcontrolnotificationhandlercodehere

}

2.显式链接(以下引用百度)

  显式链接是应用程序在执行过程中随时可以加载DLL文件,也可以随时卸载DLL文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适。不过实现显式链接要麻烦一些。在应用程序中用LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态链接库调进来,动态链接库的文件名即是上述两个函数的参数,此后再用GetProcAddress()获取想要引入的函数。自此,你就可以象使用如同在应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用FreeLibrary或MFC提供的AfxFreeLibrary释放动态链接库。下面是通过显式链接调用DLL中的Max函数的例子。
 

#include
#include
voidmain(void)
{
typedefint(*pMax)(inta,intb);
typedefint(*pMin)(inta,intb);
HINSTANCEhDLL;
PMaxMax
HDLL=LoadLibrary("MyDll.dll");//加载动态链接库MyDll.dll文件;
Max=(pMax)GetProcAddress(hDLL,"Max");
A=Max(5,8);
Printf("比较的结果为%d",a);
FreeLibrary(hDLL);//卸载MyDll.dll文件;
}

  在上例中使用类型定义关键字typedef,定义指向和DLL中相同的函数原型指针,然后通过LoadLibray()将DLL加载到当前的应用程序中并返回当前DLL文件的句柄,

然后通过GetProcAddress()函数获取导入到应用程序中的函数指针,函数调用完毕后,使用FreeLibrary()卸载DLL文件。在编译程序之前,

首先要将DLL文件拷贝到工程所在的目录或Windows系统目录下。使用显式链接应用程序编译时不需要使用相应的Lib文件。另外,使用GetProcAddress()函数时,

可以利用MAKEINTRESOURCE()函数直接使用DLL中函数出现的顺序号,如将GetProcAddress(hDLL,"Min")改为GetProcAddress(hDLL,MAKEINTRESOURCE(2))

(函数Min()在DLL中的顺序号是2),这样调用DLL中的函数速度很快,但是要记住函数的使用序号,否则会发生错误。文通过通俗易懂的方式,

全面介绍了动态链接库的概念、动态链接库的创建和动态链接库的链接,并给出个简单明了的例子,相信读者看了本文后,

能够创建自己的动态链接库并应用到后续的软件开发当中去了,当然,读者要熟练操作DLL,还需要在大量的实践中不断摸索,希望本文能起到抛砖引玉的作用。


我们再介绍一下wincc调用dll的方法

代码如下,使用从脚本调用dll,调试调用dll时需注意,在需要重新编译新dll控件时,把编译好的dll复制到wincc\bin目

录前需把wincc项目关掉,调试时发现如下问题需注意

1、不关闭wincc项目是替换不掉新dll

2、即使替换掉wincc也不掉用新的dll

3、wincc重启后才会调用新dll相关方法。

4、目前还不清楚如何把dll文件放到自定义目录下来让wincc调用,目前方法是放到wincc\bin目录下来执行dll。

#pragmacode("**.dll");
/*recipeno:配方号,recipename:配方名称,lpSetupProgram:为安装配方管理器的路径如C:\ProgramFiles\RecipeManagerV2.0,strUser:用户名,strPwd:密码*/
BOOLIsDownLoad(longrecipeno,char*recipename,char*lpSetupProgram,char*strUser,char*strPwd);
#pragmacode();

longrecipeno=1;

char*recipename="16度";

char*lpSetupProgram="C:\\ProgramFiles";

char*strUser="Admin";

char*strPwd="Admin";

intret=0;

if(GetTagBit("DownLoadTag")==1)

{

ret=IsDownLoad(recipeno,recipename,lpSetupProgram,strUser,strPwd);

if(ret)

{

SetTagBit("DownLoadTag",0);//Return-Type:BOOL

}

}




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: