当前位置:文档之家› vb编写DLL学习

vb编写DLL学习

怎样用VB编写DLL文件???你先打开VB,然后先中“ActiveX Dll”工程,然后开始编辑。

编完后,保存一般是以“.cls”和“.vbw”保存。

这时你选择“文件”菜单,弹出下拉框,选中“生成.dll”选项,它就会在上面弹出一个进度条“正在生成.dll文件”。

生成以后是一个有好象齿轮状的图标。

如果你要引用,就开一个“标准EXE”工程,然后在“工程”选项中,单击“引用”,找到你刚才的“.dll”的文件名,在前面的复选框中打勾,就可以引用你刚才在那里面写的方法等。

在vb6里建新工程时选用建立dll 做好后用vb的引用就可以了VB中创建的DLL只是COM组件,无法作为输出函数的DLL,其实这只是个错误的说法。

其实MS 非常狡猾,如果你是个VB疯狂发烧友的话,应该早就狂试出这种可以创建输出函数的DLL的方法。

VB编译文件实际上采取了两次编译的方法,首先是调用C2.exe产生*.OBJ文件,然后调用Link.EXE连接。

如果在LINK的时候添加EXPORT选项,实际上是可以输出函数的。

但是,在VB的工程选项中将这些屏蔽了。

而且过分的是:VB在Build完成后会将OBJ文件删除,这样就无法手动通过Link来创建我们需要的DLL了。

不过我找到一个比较龌鹾的变通的方法,就是先创建一个Exe工程,在Form_Load事件里面写下面的语句:Sub MainIf MsgBox("哈哈", vbOKCancel) = vbOK ThenShell "link2.exe " & Command$End IfEnd Sub然后编译为LinkTemp.EXE,接下来将LINK.EXE改名为Link2.exe,将LinkTemp.EXE改名为Link.EXE。

这样在VB调用Link.EXE时会弹出对话框,处理就会中断。

这时就可以有机会将OBJ文件拷贝出来了。

然后我创建了一个ActiveX DLL工程,在这个工程里面添加一个Module并创建一个Public函数mathadd:Public Function mathadd(ByVal a As Long, ByVal b As Long) As Longmathadd = a + bEnd Function编译这个工程,在Link的时候就会中断。

然后把创建的Class1.obj、Module1.obj、Project1.obj备份出来。

然后就可以调用Link2.exe连接OBJ到DLL了,我的连接代码是:Link2.exe "e:\vbdll\Class1.obj" "e:\vbdll\Module1.obj" "e:\vbdll\Project1.obj" "E:\Program Files\Microsoft Visual Studio\VB98\VBAEXE6.LIB" /ENTRY:__vbaS /EXPORT:mathadd /OUT:"e:\vbdll\ProjectOK.dll"/BASE:0x11000000 /SUBSYSTEM:WINDOWS,4.0 /VERS注意里面的/ENTRY和/EXPORT开关,/EXPORT开关声明了输出函数mathadd。

这样就大功告成了,可以被其他语言引入,例如在VB中,只需要:Private Declare Function mathadd Lib "e:\vbdll\ProjectOK.dll" (ByVal a As Long, ByVal b As Long) As Long我现在已经有了一个DLL文件,然后已经编了一个上位机程序,我想将那个DLL动态连接文件直接调用到我的程序里,因为初学VB所以不知道怎么调用已有的DLL文件,请帮忙~~~ 问题补充:我刚才已经把DLL文件有复制到你说的那几个文件夹里了,可是运行.EXE时还是提示找不到DLL文件啊~~~~1. 我给做了个示例工程:/kkk.rar你下载来看看, 里面就两句:模块中定义:Public Declare Function fnMyFunc Lib "MYDLL.DLL" () As Long按钮中放入:Dim str1 As Stringstr1 = "函数调用成功"If (fnMyFunc() = 42) Then MsgBox str1 '注:我那个DLL函数就返回42,其它没有了.2. 下面重新给个微软的示例代码:下列示例示范如何使用Call 语句来将控制转移到子过程、内在函数、和动态链接库(DLL)过程,' 调用一个子过程。

Call PrintToDebugWindow("Hello World")' 上面的语句将控制转移到下面的子过程。

Sub PrintToDebugWindow(AnyString)Debug.Print AnyString ' 在“立即”窗口中显示。

End Sub' 调用一个内在函数,函数的返回值被忽略不处理。

Call Shell(AppName, 1) ' AppName 包含可执行文件的路径。

' 调用Microsoft Windows DLL 过程。

该声明语句必需是类模块中的私有的,而不是标准模块中的。

Private Declare Sub MessageBeep Lib "User" (ByVal N As Integer)Sub CallMyDll()Call MessageBeep(0) ' 调用Windows DLL 过程。

MessageBeep 0 ' 再次调用,但不用“调用”这个关键字。

End SubLoadLibrary你试一试,不过这个需要自己做初始化工作。

(对应于FreeLibrary)回答者:feenn - 秀才二级3-9 09:34 这个问题好解决!你先在运行中输入:regsvr32 dll文件的绝对地址这样就注册了!然后你在VB中点工程-》引用,选中刚才注册的文件,就可以在工程中用了!如果有问题,你可以问我。

(qq;63495849)请问那里有介绍用vb编写动态连接库的!我的源程序是用VB写的,现在要改成DLL,我的C语言不行,所以想用VB改写!程序中用到数据库和串口,如何处理?用VB只能创建ActiveX DLL,不是真正的DLL!部件提供了对象形式的可复用代码。

要使用部件的代码,应用程序可以创建对象并调用对象的属性及方法,这种应用程序被称作一个客户应用程序。

对于使用部件对象的客户应用程序,部件可分为进程内运行的和进程外运行的。

进程内部件,或者说ActiveX DLL,运行在另一个应用程序的进程之中。

客户可以是应用程序本身,也可以是该应用程序正在使用的其它进程内的部件。

ActiveX DLL类似于COM组件一般用CreateObject 函数来创建对象的实例!在VB中引用ActiveX DLL就可以利用ActiveX DLL提供的属性、方法和事件了!在VB 中调用动态连接库作为一种简单易用的Windows开发环境,Visual Basic从一推出就受到了广大编程人员的欢迎。

它使程序员不必再直接面对纷繁复杂的Windows消息,而可以将精力主要集中在程序功能的实现上,大大提高了编程效率。

但凡事有利必有弊。

VB中高度的封装和模块化减轻了编程者的负担,同时也使开发人员失去了许多访问低层API函数和直接与Windows交互的机会。

因此,相比而言,VB应用程序的执行效率和功能比C/C++或Delphi生成的程序要差。

为了解决这个问题,在一个大型的VB开发应用中,直接调用Windows API函数几乎是不可避免的;同时,还有可能需要程序员自己用C/C++等开发一些动态连接库,用于在VB中调用。

本文主要讨论在32位开发环境Visual Basic 5.0中直接调用Windows 95 API 函数或用户生成的32位动态连接库的方法与规则。

Windows动态连接库是包含数据和函数的模块,可以被其它可执行文件(EXE、DLL、OCX 等)调用。

动态连接库包含两种函数:输出(exported)函数和内部(internal)函数。

输出函数可以被其它模块调用,而内部函数则只能在动态连接库内部使用。

尽管动态连接库也能输出数据,但实际上它的数据通常是只在内部使用的。

使用动态连接库的优点是显而易见的。

将应用程序的一部分功能提取出来做成动态连接库,不但减小了主应用程序的大小,提高了程序运行效率,还使它更加易于升级。

多个应用程序共享一个动态连接库还能有效地节省系统资源。

正因为如此,在Windows系统中,动态连接库得到了大量的使用。

一般来说,动态连接库都是以DLL为扩展名的文件,如Kernel32.dll、commdlg.dll等。

但也有例外,如16位Windows的核心部件之一GDI.exe其实也是一个动态库。

编写动态连接库的工具很多,如VisualC++、BorlandC++、Delphi等,具体方法可以参见相关文档。

下面只以Visual C++5.0为例,介绍一下开发应用于VisualBasic5.0的动态连接库时应注意的问题(本文中所有涉及C/C++语言或编译环境的地方,都以VC5为例;所有涉及VisualBasic的地方都以VB5 为例)。

作为一种32位Windows应用程序的开发工具,VB5生成的exe文件自然也都是32位的,通常情况下也只能调用32位的动态连接库。

但是,并不是所有的32位动态库都能被VB生成的exe 文件正确地识别。

一般来说,自己编写用于VB应用程序调用的动态连接库时,应注意以下几个方面的问题:1、生成动态库时要使用__stdcall调用约定,而不能使用缺省的__cdecl调用约定;__stdcall 约定通常用于32位API函数的调用。

2、在VC5中的定义文件(.def)中,必须列出输出函数的函数名,以强制VC5系统将输出函数的装饰名(decoratedname)改成普通函数名;所谓装饰名是VC的编译器在编译过程中生成的输出函数名,它包含了用户定义的函数名、函数参数及函数所在的类等多方面的信息。

由于在VC5中定义文件不是必需的,因此工程不包含定义文件时VC5就按自己的约定将用户定义的输出函数名修改成装饰名后放到输出函数列表中,这样的输出函数在VB生成的应用程序中是不能正确调用的(除非声明时使用Alias子句)。

因此需要增加一个.def文件,其中列出用户需要的函数名,以强制VC5不按装饰名进行输出。

相关主题