VB怎么调用DLL文件 这个DLL文件是自己用VB写的放在主程序一个文件夹里面的,网上找了很多办法都不行。

VB怎么调用DLL文件 这个DLL文件是自己用VB写的放在主程序一个文件夹里面的,网上找了很多办法都不行。,第1张

网上 的一篇文章,看完应该对你有所帮助

再谈在VB中调用VC++开发的DLL

作者:未知 来源:月光软件站

近日开发一个程序,明森用到动态链接库,在VB中调用时遇到了一些问题。我查了一些资料,也看了一下CSDN上的文章,感觉这些文章对在VB中调用VC++开发的DLL这一问题阐述得不够详细。因此在我的问题得到解决之余,特为初接触DLL的朋友们写下这篇文章。

本文中关于调用约 定的解决方法,也适用于解决其它编程语言之间DLL调用的兼容问题。

①关于DLL的创建与调用

使用VC++的向导即可。具体 *** 作如下:打开菜单“File\New”→选择“Projects\Win32 Dynamic-Link Library”→选择“A simple DLL project”即可。这时系统会自动生成3个文件:*.cpp,stdafx.cpp,stdafx.h。

之后将入口函数DLLMain()补充完整,再添加你自定义的函数的代码。如果你自定义的函数很多,可以将这些函数的声明部分统一写入一个头文件中。再在.cpp文件首部用“# include”语句引入这个头文件。注意函数声明前要加上“__declspec(dllexport)”。

(如果你建DLL时选择的是第三种类型(加入示例代码),则在函数声明及定义前都要加上系统定义的宏“*_API”。)

在VB中用如下语句声明:“Declare Function 函数名 Lib "完整路径\文件名.dll" [Alias "函数别名"] (ByVal 变量1 As 类型1, ByVal 变量2 As 类型2,…) As 类型3”,与调用API函数类似。

注意:若在窗体代码的“通用”部分使用,“Declare”前要加“Private”;若在Moudle中使用,“Declare”前要加“Public”。若将DLL文件放在“\Windows\System”或“\WinNT\System32” 目录下,“Lib”后只写出DLL主文件名即可。

具体的实例代码见④(修正后的,可直接运行)。

②关于入口点

如上编写Cipher.dll,运行,出现错误信息“找不到DLL入口点(Error 53)”。出现这一错误的原因是C++编译器在编译时对函数名备枣Encrypt作了修改。打开快速查看程序(D:\WINNT\System32\Viewers\QuikView.exe),将Cipher.dll拖激滚亩入查看窗口,找到字段“?Encrypt@@YAHHH@Z”,发现函数名被加了 一串字符。

解决方法有二。第一,直接在VB声明中将“?Encrypt@@Y AHHH@Z”作为别名放在“Alias”后即可;第二,在Cipher.dll代码中在语句“__declspec(dllexport) int __stdcall Encrypt(int p, int k)”前加上“extern "C" ”,编译后,用QuikView查看,函数名变为“_Encrypt”,之后再在VB声明中做相应调整即可。

(对于使用宏的DLL,在“#define”语句中,对宏“Cipher_API”的替换值做更改即可。)

进行了③的更改后,程序又找不到入口点了。再用QuikVie w查看,发现函数名变为“_Encrypt@8”。还有解决方法。在Cipher.dll工程中添加一个文本文件,命名为“Cipher.def”,添加代码如④。编译后再用QuikView查看,函数名变回“Encrypt”,在VB中调用,运行正常。

③关于调用约定

采用②中第二种解决方法,运行,出现错误信息“DLL调用约定错误(Error 49)”。原因是调用约定共有4种方式:__fastcall、__pascal、__stdcall、__cdecl,VC++默认调用方式为__cdecl,而VB默认调用方式则为__stdcall。解决方法是,更改代码如下(限定调用方式):

extern “C” __declspec(dllexport) int __stdcall Encrypt(int p, int k)

…………

int __stdcall Encrypt(int p, int k)

{

int c = p+k

return c

}

④源代码

Cipher.dll:

Cipher.cpp:

//引入预编译头文件

#include “stdafx.h”

//声明我的函数

extern “C” __declspec(dllexport) int __stdcall Encrypt( int p, int k )

//DLL入口函数

BOOL APIENTRY DllMain( HANDLE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved

)

{

switch( ul_reason_for_call )

{

case DLL_PROCESS_ATTACH:

case DLL_THREAD_ATTACH:

case DLL_THREAD_DETACH:

case DLL_PROCESS_DETACH:

break

}

return TRUE

}

//我的函数

int __stdcall Encrypt ( int p, int k )

{

int c = p + k

return c

}

Cipher.def:

LIBRARY Cipher

EXPORTS Encrypt

编译后,将Cipher.dll复制到“D:\WINNT\System32”目录。

在VB中调用:

Option Explicit

Private Declare Function Encrypt Lib “Cipher” _

(ByVal p As Long, ByVal k As Long) As Long

Private Sub Form_Load()

Dim c As Long

c = Encrypt(24, 8)

Text1.Text = c

要声明一个DLL过程,首先需要在代码窗口的"通用(General)"部分增加一个Declare语句。如果该过程返回一个值,应将其声明为\x0d\x0aFunction:\x0d\x0aDeclareFunctionpublicnameLib"libname"[Alias"alias"][([[ByVal]variable[Astype][,[ByVal]variable[Astype]]...])]AsType\x0d\x0a如果过程没有返回值,可将其声明为Sub:\x0d\x0aDeclareSubpublicnameLib"libname"[Alias"alias"][([[ByVal]variable[Astype][,[ByVal]variable[Astype]]...])]\x0d\x0a缺省情况下,在标准模块中声明的DLL过程,可以在应用程序的任何地方调用凯余它。在其它类型的模块中定义的DLL过程则是模块私有的,必须在它们前面声明Private关键字,以示区分。下面分别介绍声明语句的各个组成部分。\x0d\x0a(一)、指定动态库:\x0d\x0aDeclare语句中的Lib子句用来告诉VisualBasic如何找到包含过程的.dll文件。如果引用的过程属于Windows核心库(User32、Kernel32或GDI32),则可以不包含文件扩展名,如:\x0d\x0aDeclareFunctionGetTickCountLib"kernel32"Alias"GetTickCount"()AsLong\x0d\x0a对于其它动态连接库,可以在Lib子句指定文件的路径:\x0d\x0aDeclareFunctionlzCopyLib"c:/windows/lzexpand.dll"_\x0d\x0a(ByValSAsInteger,ByValDAsInteger)AsLong\x0d\x0a如果未指定libname的路径,VisualBasic将按照下列顺序查找该文件:\x0d\x0a①.exe文件所在的目录\x0d\x0a②兆旦当前目录\x0d\x0a③Windows系统目录\x0d\x0a④Windows目录\x0d\x0a⑤Path环境变量中的目录\x0d\x0a下表中列出了常用的 *** 作系统环境库文件。\x0d\x0a动态链接库描述\x0d\x0aAdvapi32.dll高级API服务,支持大量的API(其中包括许多安全与注册方面的调用)\x0d\x0aComdlg32.dll通用对话框API库\x0d\x0aGdi32.dll图形设备接族孙扰口API库\x0d\x0aKernel32.dllWindows32位核心的API支持\x0d\x0aLz32.dll32位压缩例程\x0d\x0aMpr.dll多接口路由器库\x0d\x0aNetapi32.dll32位网络API库\x0d\x0aShell32.dll32位ShellAPI库\x0d\x0aUser32.dll用户接口例程库\x0d\x0aVersion.dll版本库\x0d\x0aWinmm.dllWindows多媒体库\x0d\x0aWinspool.drv后台打印接口,包含后台打印API调用。\x0d\x0a对于Windows的系统API函数,可以利用VB提供的工具APIViewer查找某一函数及其相关数据结构和常数的声明,并复制到自己的程序中。

DLL(动态链接库)是一个很有用的东西,在开发大项目的时候显得非常重要,因为多人合作开发时,可以给每个人分配一个任务,用DLL完成,最后组合起来,就不会出现互相冲突的问题。这里给出最简单的DLL编写与调用的示例

首先,我们打开VB.NET,选择类库,名称改为test

然后输入以下代码

Public Class test

    Public Function test(ByVal a As Long, ByVal b As Long) As Long

        Return a + b

    End Function

End Class

保存后,生成DLL文件。

这就是最简单的一个DLL,下面是调用该DLL的示例

新建一个梁枣工程,单击“项目” -->添加引用

找到刚才生成的DLL,双击它

添加引用以后,似乎什么也没发生,这时我们输入以下代码:

Imports test.test

这样,就包含了该DLL的类。

然后我们定义一个类

Dim test As New test.test

这样,就可以使用里面的函数了,下面是程序示燃源例

Imports test.test

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim test As New test.test

        MsgBox(test.test(1, 2))

    End Sub

End Class

运行该程序,可以看到,调用了DLL内的函数。

这就是最皮渣态简单的DLL示例,可以将一些复杂的代码集成到DLL里,以后升级或重用都比较方便。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11979175.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存