关于VB是DLL的问题!高手低手都请进!!
李赞红 2005-08-23 01:17:16 我想用VB生成一个非组件DLL,使用了下面的方法,但是DLL工程中的函数参数或变量的数据类型有String时程序就会崩溃,所以,请高手低手一起来解决这个问题,对您应该有帮助的.
其实我也不知道这算不算真正的DLL,我把操作过程帖出来吧,大家可以试试,但是经过验证,用这种方式写出来的DLL是不需要注册的,像一个标准的DLL一样可以直接调用.
第一步:创建一个标准EXE工程,在窗体的Load事件中写如下的代码:
Private Sub Form_Load()
'先写一个代替VB的链接程序Link.exe的代码
If MsgBox("真的要创建链接程序吗?" & vbCrLf & _
"要创建,请选择 确定" & vbCrLf & _
"不创建,请选择 取消", vbOKCancel) = vbOK Then
Shell "Link2.exe " & Command$
'注:Link2.exe由VB的链接程序Link.exe改得而得。
End If
End
End Sub
编译生成可执行文件linktemp.exe,并复制到VB的程序目录下,如:D:\Program Files\Microsoft Visual Studio\VB98,并把该目录下的Link.exe改名为Link2.exe,再把刚才生成的linktemp.exe改名为Link.exe
第二步:创建一个ActiveX DLL工程,新建一个标准模块,在标准模块中写入如下代码:
Option Explicit
'加法运算
Public Function mathAdd(a As Integer, _
b As Integer) As Integer
mathAdd = a + b
End Function
'判断是否同闰年
Public Function isLeap(y As Integer) As Boolean
If y Mod 4 = 0 And y Mod 100 <> 0 Or _
y Mod 400 = 0 Then
isLeap = True
Else
isLeap = False
End If
End Function
'判断是否是素数
Public Function isPrime(num As Integer) As Boolean
Dim i As Integer
For i = 2 To num - 1
If num Mod i = 0 Then
Exit For
End If
Next
If num = i Then
isPrime = True
Else
isPrime = False
End If
End Function
开始我在调试的时候,这三个函数都是整型类型,所以上面的三个例子是没问题的.
接下来生成DLL文件,选择“文件”-“生成XXX.DLL”,此时会弹出一个对话框,不要关闭该对话框,因为此时会生成三个.obj目标文件,
如:"E:\TrueDll\obj\Class1.obj"
"E:\TrueDll\obj\Module1.obj"
"E:\TrueDll\obj\Usally.OBJ"
把这三个.obj文件复制到别的地方,等一下链接时要用到。
复制完后在刚才的对话框上选择否,即不生成DLL,我们的目的就是要得到这三个目标文件.
第三步:在“运行”中输入“cmd”,打开DOS窗口,把目录切换到VB的工作目录,如:D:\Program Files\Microsoft Visual Studio\VB98
然后执行下面的命令:
link2.exe "E:\TrueDll\obj\Class1.obj" "E:\TrueDll\obj\Module1.obj" "E:\TrueDll\obj\Usally.OBJ" "D:\Program Files\Microsoft Visual Studio\VB98\VBAEXE6.LIB" /ENTRY:__vbaS /EXPORT:mathAdd /EXPORT:isLeap /EXPORT:isPrime /OUT:"E:\TrueDll\Usally.dll" /BASE:0x11000000 /SUBSYSTEM:WINDOWS,4.0 /VERS
大家仔细看这段命令,只需要注意文件路径是否正确就可以,其他的照抄就行。
如果命令执行成功,会生成一个DLL文件,如:Usally.dll
第四步:测试该DLL:新建一个标准EXE工程,输入如下代码:
Option Explicit
Private Declare Function mathAdd _
Lib "Usally.dll" (a As Integer, b As Integer) As Integer
Private Declare Function isLeap _
Lib "Usally.dll" (y As Integer) As Boolean
Private Declare Function isPrime _
Lib "Usally.dll" (num As Integer) As Boolean
Private Sub Command1_Click()
MsgBox mathAdd(Text1.Text, Text2.Text)
'直接调试会提示找不到DLL文件,可以先
'编译成Exe文件,然后直接运行
'但是Usally.dll和本工程的可执行文件exe必须在
'同一目录下
End Sub
Private Sub Command2_Click()
MsgBox isLeap(Text3.Text)
End Sub
Private Sub Command3_Click()
MsgBox isPrime(Text4.Text)
End Sub
编译生成EXE文件,然后程序就可以正常运行了。
---------------------------------------------
如果您是按照上面的方法去做的,应该是没任何问题的,在DOS窗口编译时可能会有一些警告,不需要理会就可以。我的问题是:如果DLL工程中的函数有String类型的参数或变量,程序就会完全崩溃,其实我以前也一直以为VB不能生成标准的DLL,看了这种方法后如果可行的话,是非常不错的。有兴趣,你也不妨试试。