首页
新闻
论坛
群组
Blog
文档
下载
读书
Tag
网摘
搜索
.NET
Java
游戏
视频
人才
外包
培训
数据库
书店
程序员
欢迎您:
游客
| 退出
| 登录
注册
帮助
我的帖子
我参与的帖子
我的空间
我的网摘
CSDN
CSDN社区
VB
COM/DCOM/COM+
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
生成帖子
置顶
推荐(加精)
取消推荐(加精)
锁定帖子
移动帖子
取消引用
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
这个方法真的可行吗?????
[已结贴,结贴人:lan563]
加为好友
发送私信
在线聊天
lan563
炸子骨
等级:
可用分等级:
贫农
总技术专家分:
159
总技术专家分排名:
68325
揭帖率:
100.00%
发表于:
2008-05-21 23:01:14
楼主
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 /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
问题点数:
50
回复次数:
9
显示所有回复
显示星级回复
显示楼主回复
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
zzyong00
阿勇
等级:
可用分等级:
掌柜
总技术专家分:
14204
总技术专家分排名:
1102
2
发表于:
2008-05-21 23:13:23
1
楼 得分:
20
我晕,当然可行,
你自己可以试试啊!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
chenjl1031
东方之珠
等级:
可用分等级:
中农
总技术专家分:
11913
总技术专家分排名:
1537
4
发表于:
2008-05-21 23:23:54
2
楼 得分:
20
引用楼主 lan563 的帖子:
VB中创建的DLL只是COM组件,无法作为输出函数的DLL,其实这只是个错误的说法。其实MS非常狡猾,如果你是个VB疯狂发烧友的话,应该早就狂试出这种可以创建输出函数的DLL的方法。
VB编译文件实际上采取了两次编译的方法,首先是调用C2.exe产生*.OBJ文件,然后调用Link.EXE连接。如果在LINK的时候添加EXPORT选项,实际上是可以输出函数的。但是,在VB的工程选项中将这些屏蔽了。而且过分的是:VB在Build完成后会将OBJ文件删除,这…
你这个来自这吧: http://www.china-askpro.com/msg6/qa07.shtml
可以,但很有限,不是所有的都行。毕竟VB代替不了VC!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
lan563
炸子骨
等级:
可用分等级:
贫农
总技术专家分:
159
总技术专家分排名:
68325
发表于:
2008-05-22 00:11:37
3
楼 得分:
0
是标准DLL吗??
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
overown
二师兄
等级:
可用分等级:
中农
总技术专家分:
187
总技术专家分排名:
63066
发表于:
2008-05-22 10:10:44
4
楼 得分:
10
的确可以 但并不表示这就是标准的dll
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
lan563
炸子骨
等级:
可用分等级:
贫农
总技术专家分:
159
总技术专家分排名:
68325
发表于:
2008-05-22 11:04:49
5
楼 得分:
0
上边的连接代码跟下边的有所出入~~不知道哪个对哪个错呢???
"C:\Documents and Settings\Administrator\桌面\Class1.OBJ" "C:\Documents and Settings\Administrator\桌面\Module1.OBJ" "C:\Documents and Settings\Administrator\桌面\工程1.OBJ" "C:\Program Files\Microsoft Visual Studio\VB98\VBAEXE6.LIB" /ENTRY:__vbaS /OUT:"C:\Documents and Settings\Administrator\桌面\工程1.dll" /BASE:0x11000000 /SUBSYSTEM:WINDOWS,4.0 /VERSION:1.0 /DLL /INCREMENTAL:NO /OPT:REF /MERGE:.rdata=.text /IGNORE:4078
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
lan563
炸子骨
等级:
可用分等级:
贫农
总技术专家分:
159
总技术专家分排名:
68325
发表于:
2008-05-22 11:09:46
6
楼 得分:
0
注意里面的/ENTRY和/EXPORT开关 看漏眼了~
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
yangao
沉默の羔羊
等级:
可用分等级:
掌柜
总技术专家分:
15517
总技术专家分排名:
917
发表于:
2008-05-22 11:17:28
7
楼 得分:
0
学习
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
lan563
炸子骨
等级:
可用分等级:
贫农
总技术专家分:
159
总技术专家分排名:
68325
发表于:
2008-05-22 14:23:12
8
楼 得分:
0
真的可以哦
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
myjian
嗷嗷叫的老马---回到老窝的老马_人真难做啊~~~~
等级:
可用分等级:
中农
总技术专家分:
15623
总技术专家分排名:
905
2
发表于:
2008-05-29 04:15:47
9
楼 得分:
0
广告一下,哇哈哈~~~
http://www.m5home.com/soft/vb_link.rar
用这个试下?
应该比你手工方便.
修改
删除
举报
引用
回复
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
网站简介
-
广告服务
-
网站地图
-
帮助
-
联系方式
-
诚聘英才
-
English
-
问题报告
北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
abc推荐给好友