社区
VB基础类
帖子详情
关于vb调用第三方dll问题!
ldh_0421
2004-08-31 02:12:14
第三方dll文件在win2000下无法注册,vb中也无法引用(引用出错),这样的话有没有可以使用它的其他方法?如有该怎么办?
...全文
239
9
打赏
收藏
关于vb调用第三方dll问题!
第三方dll文件在win2000下无法注册,vb中也无法引用(引用出错),这样的话有没有可以使用它的其他方法?如有该怎么办?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
调用
dephi写的
Dll
测试
这是一个dephi写的
dll
,在
vb
调试环境下一
调用
就崩溃,调试目的就是在
VB
调试环境下找到可用的声明及
调用
代码
VB
调用
winrar.
dll
进行rar文件的解压缩
在使用
VB
进行开发的过程中,如果需要对RAR文件进行解压,可以使用本源码试试,比外部
调用
winrar更加稳定。
VB
生成标准
DLL
的方法,
VB
制作标准
DLL
VB
生成标准
DLL
的方法,
VB
制作标准
DLL
VB
调用
WINRAR的
dll
实例
VB
调用
WINRAR的unrar.
dll
实例
VB基础类
7,785
社区成员
197,585
社区内容
发帖
与我相关
我的任务
VB基础类
VB 基础类
复制链接
扫一扫
分享
社区描述
VB 基础类
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章