用VB编写DLL动态链接库方法
来源:互联网 发布:海尔反渗透净水机 知乎 编辑:程序博客网 时间:2024/05/18 03:36
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 Main
If MsgBox("哈哈", vbOKCancel) = vbOK Then
Shell "link2.exe " & Command$
End If
End 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 Long
mathadd = a + b
End 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 /VERSION:1.0 /Dll /INCREMENTAL:NO /OPT:REF /MERGE:.rdata=.text /IGNORE:4078
注意里面的/ENTRY和/EXPORT开关,/EXPORT开关声明了输出函数mathadd。这样就大功告成了,可以被其他语言引入,例如在VB中,只需要:
Private Declare Function mathadd Lib "e:/vbdll/ProjectOK.dll" (ByVal a As Long, ByVal b As Long) As Long
VB编译文件实际上采取了两次编译的方法,首先是调用C2.exe产生*.OBJ文件,然后调用Link.EXE连接。如果在LINK的时候添加EXPORT选项,实际上是可以输出函数的。但是,在VB的工程选项中将这些屏蔽了。而且过分的是:VB在Build完成后会将OBJ文件删除,这样就无法手动通过Link来创建我们需要的DLL了。不过我找到一个比较龌鹾的变通的方法,就是先创建一个Exe工程,在Form_Load事件里面写下面的语句:
Sub Main
If MsgBox("哈哈", vbOKCancel) = vbOK Then
Shell "link2.exe " & Command$
End If
End 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 Long
mathadd = a + b
End 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 /VERSION:1.0 /Dll /INCREMENTAL:NO /OPT:REF /MERGE:.rdata=.text /IGNORE:4078
注意里面的/ENTRY和/EXPORT开关,/EXPORT开关声明了输出函数mathadd。这样就大功告成了,可以被其他语言引入,例如在VB中,只需要:
Private Declare Function mathadd Lib "e:/vbdll/ProjectOK.dll" (ByVal a As Long, ByVal b As Long) As Long
- 用VB编写DLL动态链接库方法
- 用VB编写DLL动态链接库方法
- VB编写.DLL动态链接库文件
- 怎样用VB编写.DLL动态链接库文件
- 怎样用VB编写.DLL动态链接库文件
- 采用VB编写的动态链接库(ActiveX DLL)
- 怎样用VB编写.DLL动态链接库文件
- 怎样用VB编写.DLL动态链接库文件
- C语言编写DLL动态链接库并分别用VB和Python调用
- 编写.dll动态链接库
- DLL动态链接库,自己编写方法,自己研究
- VB开发动态链接库DLL和标准API DLL方法和常见问题
- 学会用 VC++ 动态链接库编写 DLL 木马
- 学会用 VC++ 动态链接库编写 DLL 木马
- VS2010编写动态链接库DLL及单元测试用例
- 为Symbian编写动态链接库DLL
- 为Symbian编写动态链接库DLL
- 为Symbian编写动态链接库DLL
- Zoundry发布工具
- Using LINQ to SQL (Part 1)
- 让Timer控件每5分钟触发一次事件
- LINQ to SQL (Part 2 - Defining our Data Model Classes)
- MSChart饼图显示百分比-------牵手的博客
- 用VB编写DLL动态链接库方法
- WordPress正磨灭人们对于web2.0的激情
- CrystalReport 使用总結
- XSLT Designer快速入门指南
- 得到颜色的RGB值
- 用css实现表格行交替变色
- VB数据库编程的几点心得(上)
- 整理MSDN中的SqlConnection.ConnectionString 属性
- 本周Asp.net源码更新(6.25-6.29)