标题:[求助]VB中创建DLL的一个基本的问题
只看楼主
luoxinxin
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-1-28
 问题点数:0 回复次数:11 
[求助]VB中创建DLL的一个基本的问题

我的目的是创建一个add函数的mydll.dll文件,并放在e:\目录下,当中遇到了几点问题,请高手指点下:
创建一个activex dll ,代码如下:
Public Function add(x as long,y as long) as long
add=x+y
end function
然后编译生成mydll.dll,存放在e:\目录下,注册成功以后,创建exe,代码如下:
Private declare function add lib "e:\mydll.dll"(x as long,y as long)as long '声名函数,可能是这里出了问题
private sub command_click()
text3.text=add(text1.text,text2.text)
end sub
VB6提示找不到dll入口,请问这个问题如何解决,小弟刚开始学DLL,这个是最基本的问题,请各位高手一定指点,“十分”感谢!

搜索更多相关主题的帖子: DLL long add dll function 
2007-02-23 04:26
121038
Rank: 1
等 级:新手上路
威 望:2
帖 子:414
专家分:0
注 册:2005-8-3
得分:0 
Private declare function add lib "e:\mydll.dll"(byval x as long,byval y as long)as long

参数的前面没加byval,加上去试试

2007-02-23 10:34
luoxinxin
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-1-28
得分:0 

还是没用用。。


2007-02-23 18:30
121038
Rank: 1
等 级:新手上路
威 望:2
帖 子:414
专家分:0
注 册:2005-8-3
得分:0 
哈哈~

2007-02-23 20:38
121038
Rank: 1
等 级:新手上路
威 望:2
帖 子:414
专家分:0
注 册:2005-8-3
得分:0 
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




2007-02-23 20:38
121038
Rank: 1
等 级:新手上路
威 望:2
帖 子:414
专家分:0
注 册:2005-8-3
得分:0 
太牛了,不过很复杂,原来VB无法做真正的DLL

2007-02-23 20:38
luoxinxin
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-1-28
得分:0 
这个应该是可以的,我试一下

2007-02-24 19:10
liang1218
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2006-7-24
得分:0 

牛!这就去试一下

2007-02-26 13:57
清澂居士
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:1237
专家分:7
注 册:2006-12-19
得分:0 
呵呵 ```這種方法以前很流行的``不過```

佛曰:\"前世的500次回眸才换来今生的一次擦肩而过\".我宁愿用来世的一次擦肩而过来换得今生的500次回眸.
2007-02-27 11:08
清澂居士
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:1237
专家分:7
注 册:2006-12-19
得分:0 
現在有一個工具叻吧``

[此贴子已经被作者于2007-2-27 11:09:02编辑过]


佛曰:\"前世的500次回眸才换来今生的一次擦肩而过\".我宁愿用来世的一次擦肩而过来换得今生的500次回眸.
2007-02-27 11:08



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-121449-1-1.html




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

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