首先我们介绍一下vb调用dll的几种方法
一、在vb工程中引用dll
1.在工程-引用中将asdfg.dll引用过来
2.dim cc as asdfg 'asdfg是类模块的名称 Private Sub Form_Load() dim x Set cc= New asdfg x = cc.zxc(参数1,参数2) '参数1,
2自己写 End Sub 建议你了解一下下面dll的制作方法,理解就更透彻了。下面内容来自百度。1.新建一个ActiveX Dll,工程名
字 为vbmytestdll,类模块名字为mytestdll 2.类模块内容只有一个函数,主要返回DLL的HELLO WORLD Public Function dlltest1() As String dlltest1 = "HELLO WORLD" End Function 3.保存,生成DLL,名字为 vbmytestdll.dll 4.新建一个EXE工程,在菜单: 工程---引用---浏览里找到vbmytestdll.dll,把它引用进来 5.EXE工程代码如下: Option Explicit Dim testdll As mytestdll'类模块名字 Private Sub Form_Load() Set testdll = New mytestdll 'DLL的一个新实例 Me.Caption = testdll.dlltest1 '我的标题=返回DLL的HELLO WORLD End Sub
二、在vb工程中写代码动态的把dll引用进去
Option Explicit '主窗体代码
Private Declare Function IsDownLoad Lib "DLLDload.dll" (recipeno As Long, recipename As String, lpSetupProgram As String, strUser As String, strPwd As String) As Boolean
Private Sub Command1_Click() Dim aa As Long Dim bb As String Dim cc As String Dim dd As String Dim ee As String Dim ff As Boolean aa = 1 bb = " 13度" cc = "C:\Program Files" dd = "Admin" ee = "Admin" ff = IsDownLoad(aa, bb, cc, dd, ee) End Sub
我们介绍一下VC调用dll的几种方法
一、隐式链接
隐式链接就是在程序开始执行时就将DLL文件加载到应用程序当中。只要将导入函
数关键字_declspec(dllimport)函数名等写到应用程序相应的头文件中就可以
了。头文件中加入函数
bool _declspec(dllimport) IsDownLoad(long recipeno,
char *recipename,char *lpSetupProgram,char *strUser,
char *strPwd);.cpp中加入如下代码即可导入lib文件可以在工程中引入,
也可以用代码导入#pragma comment(lib,"MyDll.lib")在创建.exe文件
之前,要先将.dll和.lib拷贝到当前工程所在的目录下面,
也可以拷贝到windows的System目录下。如果DLL使用的是def文件,
要删除TestDll.h文件中关键字extern "C"。.h文件中的关键字
Progam commit是要Visual C+的编译器在link时,链接到.lib文件,当然,
开发人员也可以不使用#pragma comment(lib,"**.lib")语句,
而直接在工程的Setting->Link页的Object/Moduls栏填入MyDll.lib既可。
_declspec(dllimport) bool IsDownLoad(long recipeno,char *recipename,char *lpSetupProgram,char *strUser,char *strPwd);
void CAatestDlg::OnButton1()
{
// TODO: Add your control notification handler code hereCString aa;
long bb;
bb=1;
char *aa=" 13度";
char *cc="C:\\Program Files";
char *dd="Admin";
char *ee="Admin";
if(IsDownLoad(bb,aa,cc,dd,ee))
MessageBox(L"asdf"); // TODO: Add your control notification handler code here
}
2.显式链接 (以下引用百度)
显式链接是应用程序在执行过程中随时可以加载DLL文件,也可以随时卸载DLL文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适。不过实现显式链接要麻烦一些。在应用程序中用LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态链接库调进来,动态链接库的文件名即是上述两个函数的参数,此后再用GetProcAddress()获取想要引入的函数。自此,你就可以象使用如同在应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用FreeLibrary或MFC提供的AfxFreeLibrary释放动态链接库。下面是通过显式链接调用DLL中的Max函数的例子。
#i nclude
#i nclude
void main(void)
{
typedef int(*pMax)(int a,int b);
typedef int(*pMin)(int a,int b);
HINSTANCE hDLL;
PMax Max
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。
#pragma code("**.dll");
/*recipeno:配方号,recipename:配方名称,lpSetupProgram:为安装配方管理器的路径如C:\Program Files\Recipe Manager V2.0,strUser:用户名,strPwd:密码*/
BOOL IsDownLoad(long recipeno,char *recipename,char *lpSetupProgram,char *strUser,char *strPwd);
#pragma code();
long recipeno=1;
char *recipename=" 16度";
char *lpSetupProgram="C:\\Program Files";
char *strUser="Admin";
char *strPwd="Admin";
int ret=0;
if (GetTagBit("DownLoadTag")==1)
{
ret= IsDownLoad(recipeno,recipename,lpSetupProgram,strUser,strPwd);
if (ret)
{
SetTagBit("DownLoadTag",0); //Return-Type: BOOL
}
}