社区
VB基础类
帖子详情
关于vb调用第三方dll问题!
ldh_0421
2004-08-31 02:12:14
第三方dll文件在win2000下无法注册,vb中也无法引用(引用出错),这样的话有没有可以使用它的其他方法?如有该怎么办?
...全文
199
9
打赏
收藏
关于vb调用第三方dll问题!
第三方dll文件在win2000下无法注册,vb中也无法引用(引用出错),这样的话有没有可以使用它的其他方法?如有该怎么办?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
online
2004-08-31
打赏
举报
回复
参考
你写得有问题
再谈在VB中调用VC++开发的DLL
浏览选项: 大中小 颜色 默认 灰度 橄榄色 绿色 蓝色 褐色 红色
近日开发一个程序,用到动态链接库,在VB中调用时遇到了一些问题。我查了一些资料,也看了一下CSDN上的文章,感觉这些文章对在VB中调用VC++开发的DLL这一问题阐述得不够详细。因此在我的问题得到解决之余,特为初接触DLL的朋友们写下这篇文章。
本文中关于调用约定的解决方法,也适用于解决其它编程语言之间DLL调用的兼容问题。
①关于DLL的创建与调用
使用VC++的向导即可。具体操作如下:打开菜单“FileNew”→选择“ProjectsWin32 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文件放在“WindowsSystem”或“WinNTSystem32”目录下,“Lib”后只写出DLL主文件名即可。
具体的实例代码见④(修正后的,可直接运行)。
②关于入口点
如上编写Cipher.dll,运行,出现错误信息“找不到DLL入口点(Error 53)”。出现这一错误的原因是C++编译器在编译时对函数名Encrypt作了修改。打开快速查看程序(D:WINNTSystem32ViewersQuikView.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”的替换值做更改即可。)
进行了③的更改后,程序又找不到入口点了。再用QuikView查看,发现函数名变为“_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:WINNTSystem32”目录。
在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
End Sub
ldh_0421
2004-08-31
打赏
举报
回复
提示“dll调用约定错误!”
online
2004-08-31
打赏
举报
回复
把dll文件放在同一个工程的目录下试试
jam021
2004-08-31
打赏
举报
回复
把dll文件放到system32目录下试试,去掉绝对路径
ldh_0421
2004-08-31
打赏
举报
回复
为什么会提示“文件xxx”找不到,其实文件是存在的,路径绝对没问题!
online
2004-08-31
打赏
举报
回复
我现在有些听不懂你的意思了
如果是普通dll,就和api的调用是一样的
如
Private Declare Function WLock Lib "F:\csdn_vb\vcdll测试\lock\FPlock.dll" Alias "#1" (ByVal sText As String, ByVal iLen As Long) As Long
ldh_0421
2004-08-31
打赏
举报
回复
为什么delphi不需要注册,直接就可以声明使用?
ldh_0421
2004-08-31
打赏
举报
回复
怎么用?
online
2004-08-31
打赏
举报
回复
有没有安装程序??
可能第三方dll不需要注册,直接使用
ABAP
调用
DLL
文件
有时外部程序
调用
SAP 的RFC, 实现与SAP程序的接口, 是以外部程序为主; 现在终于找到以SAP程序为主
调用
外部程序的方法了. 就是SAP 的ABAP语言
调用
DLL
文件中的函数实现一些功能, 例如可以用
DLL
文件连接外部数据库读取数据. 我在网上找了好久,都没有一个完整的答案, 也没有一个完整的实例, 根据网上的各种说法, 我整合到一起, 终于成功, 原来这么简单
VB
A
调用
dll
实例
VB
A
调用
dll
是指定路径的,如果该路径下没有想调的
dll
怎么办,本文给出了一个解决方法
VB
.NET
调用
avicap32.
dll
实现照相功能
VB
.NET要实现照相功能,有两种方法:一个是
调用
windows的API函数avicap32.
dll
实现照相功能,另一个就是采用
第三方
程序实现照相功能。
SuperDotNetAPI:API方式直接
调用
C#的
DLL
,支持多音字转拼音、Gzip解压缩、公式计算(
VB
A、C++、
VB
、Delphi甚至java都可以)
这两年,我在
VB
A应用方面一直有几大痛点: 1、多音字转拼音; 2、64位下的GZIP解压缩; 3、数学公式计算; 4、离线中文OCR识别(见excelhome)。 为了解决这几个个长期困扰我的
问题
,以及未来经常会遇到的其它
问题
(例如AES加解密、验证码图片处理、文本编解码、大数的数学运算、多线程等等),我考虑在
VB
A中
调用
C#的
dll
来彻底解决。 正常情况下,
vb
a
调用
C#的
dll
要通过com方式先注册后运行,这在很多场合是不方便的,因此我采用给C#
dll
加上导出函数的方式,使C#的
dll
能够被其它语言以API方式直接
调用
,要做到这一点,需要对托管代码的
DLL
做一些特殊的处理,以确保提供导出函数接口签名给
第三方
调用
。 下面的附件演示了多音字转拼音(自带六十多万词库,无需微软拼音)和GZIP解压缩、数学公式计算。 本
DLL
库可以被C++、
VB
6、Delphi、
VB
A等多种语言
调用
(接口提供
VB
A示例,其它语言自己写。)。支持32位和64位操作系统。 运行环境:需要.net Framework 4.0或以上,支持XP。
第三方
串口通讯组件PCOMM类模块
VB
6.0自带的MSCOMM控件端口号只能设置有限的个数,但是PCOMM控件可以设置任意多个,而且功能强大。
VB基础类
7,763
社区成员
197,609
社区内容
发帖
与我相关
我的任务
VB基础类
VB 基础类
复制链接
扫一扫
分享
社区描述
VB 基础类
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章