| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1060 人关注过本帖
标题:[经验]好不容易弄的VB编写真正的.DLL程序...
只看楼主 加入收藏
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
 问题点数:0 回复次数:6 
[经验]好不容易弄的VB编写真正的.DLL程序...

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

仓促之间,可能有些地方没想到,大家帮忙改正一下...

搜索更多相关主题的帖子: DLL 经验 编写 
2006-12-01 22:14
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
收藏
得分:0 
什么是DLL.什么是link2 能给我说说吗?谢谢!

/images/2011/147787/2011051411021524.jpg" border="0" />
2006-12-01 22:32
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
得分:0 

DLL的全称是Dynamic Link Library,中文叫做“动态链接文件”。在Windows操作系统中,DLL对于程序执行是非常重要的,因为程序在执行的时候,必须链接到DLL文件,才能够正确地运行。而有些DLL文件可以被许多程序共用。因此,程序设计人员可以利用DLL文件,使用程序不至于太过巨大。但是当安装的程序越来越多,DLL文件也就会越来越多,如果当你删除程序的时候,没有用的DLL文件没有被删除的话,久而久之就造成系统的负担了。

Visual Basic 5.0以上版本也可以编写一种特殊的DLL,即ActiveX DLL。 VB中创建的DLL只是COM组件,无法作为输出函数的DLL.

当你用API的时候..例如:
Public Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" _
(ByVal lpBuffer As String, ByVal nSize As Long) As Long
这个就是调用系统的DLL文件..


[GLOW=255,DeepPink,3]我的免费网盘[/GLOW]
2006-12-01 22:47
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
收藏
得分:0 
哦...原来API的本质就是DLL...还有一个问题就是学好VB是不是一定要精通API?谢谢了

/images/2011/147787/2011051411021524.jpg" border="0" />
2006-12-01 23:04
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
得分:0 

API就是扩展了VB的各种功能....咯咯,灌水灌晕了 不知道说什么了....学API是一定要的


[GLOW=255,DeepPink,3]我的免费网盘[/GLOW]
2006-12-01 23:37
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
收藏
得分:0 
呵呵...这也算灌水吗?非常谢谢你的回答...以后我要做个像样的程序你看看!

/images/2011/147787/2011051411021524.jpg" border="0" />
2006-12-01 23:48
weiyi75
Rank: 1
等 级:新手上路
威 望:1
帖 子:43
专家分:0
注 册:2006-9-7
收藏
得分:0 
请版主写个全局拦截消息的例子吧,不是子类化,比如拦截关闭显示器的消息,当系统设置节能时间到时发生。

网上都说要把代码放入dll里面,VB又不能搞dll.
2006-12-02 23:20
快速回复:[经验]好不容易弄的VB编写真正的.DLL程序...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021102 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved