vb6.0创建“标准”DLL的变态方法(附最简单方法6行代码)

我发现了一个新方法,不需要修改假的Link.exe文件。

6行代码最简单的VB6标准DLL工程-CSDN下载
https://download.csdn.net/download/xiaoyao961/11168916

新建一个EXE工程,引用vbapi.dll这个COM对象
他又是标准DLL,又是COM DLL,VB6就是这么强大。

Private Declare Function Sum Lib "VbApi" (ByVal a As Long, ByVal b As Long) As Long
 
Private Sub Command1_Click()
Dim a As Long, b As Long, c As Long
a = 11
b = 22
c = Sum(a, b)
MsgBox "c=" & c
End Sub

Private Sub Command2_Click()
Dim MyClass As New VbApi.Class1
Dim a As Long, b As Long, c As Long
a = 11
b = 22
c = MyClass.Sum2(a, b)
MsgBox "c=" & c
End Sub

Private Sub Form_Load()

End Sub

以下是旧方法:

vb6.0 IDE开发环境能创建 Activex DLL工程,这类工程发布的DLL,从严格意义上VB建立的DLL并不是像VC一样的动态链接库,VB建立的是ActiveX DLL,不能像kernel32.dll”那样通过“Declare Function .....”来调用的,这种ActiveX DLL是通过访问类的方式调用的:step1,注册DLL;step2,开一个“标准EXE”工程,然后在“工程”选项中,单击“引用”,找到“.dll”的文件名,在前面的复选框中打勾,代码 新建一个类,访问类的方法,如下:

    Dim Ncls As New PRO.Class1
    Ncls.Function1(para1)

那VB怎样创建“标准”的DLL呢?

一,VB编译文件原理

       首先需要明白VB编译文件时实际上采取了两次编译的方法,首先是调用C2.exe产生*.OBJ文件,然后调用Link.EXE连接,C2.exe 和LINK.exe 在VB的安装目录可以找到:C:\Program Files\Microsoft Visual Studio\VB98。如果在LINK的时候添加EXPORT选项,实际上是可以输出函数的。但是,在VB的工程选项中将这些屏蔽了。而且过分的是:VB在Build完成后会将OBJ文件删除,这样就无法手动通过Link来创建我们需要的DLL了。

二,制作“标准”DLL文件

   对于“link.exe”,可以通过改变参数来调整其编译链接后的结果。因此,我们可以通过截获工程的obj文件,再把调用LINK.exe链接这些obj文件,并指明“/EXPORT”的函数即可。

第一步,如何截获工程的obj文件

   步骤一:建立一个假的“Link.exe”;

       建立一个新的项目,在那个项目中建立一个“Form”,然后,在“Form”中加入如下代码:
        Private Sub Form_Load()
            MsgBox "现在可以拷贝OBJ文件了!"
            End
       End Sub

    编译为:Link.exe
 
       步骤二:将“C:\Program Files\Microsoft Visual Studio\VB98\Link.exe”改名为“Link2.exe”;
 
       步骤三:将假的那个Link.exe复制到“C:\Program Files\Microsoft Visual Studio\VB98\”中;
      通过以上三步就可以在VB调用Link.EXE时会弹出对话框,处理就会中断。这时就可以有机会将OBJ文件拷

贝出来了。
第二步,生成obj文件

         步骤一:建立一个新项目(VBStardDLL.vbp),选择“ActiveX DLL”,此时自动生成一个Class1类,添加一个“Module”,命名为Module1,在Module1中加入如下代码:

              Public Function mathAdd(ByVal a As Long, ByVal b As Long) As Long
                        mathAdd = a + b
              End Function
              Public Function mathIncremente(ByVal a As Long, ByVal b As Long) As Long
                       mathIncremente= a * b
               End Function
              这里特别注意:需要输出的函数必须写在模块(Module)中,写在类(Class)里面是不能输出的。
        步骤二:用VB菜单编译(文件-->生成Project1.dll)
               当编译的时候会弹出一个对话框
         步骤三:到当前工程目录下复制出OBJ文件,Class1.OBJ,Module1.OBJ,VBStardDLL.OBJ,将这三个文件复制到:“D:\LINKOBJ”这个文件夹。
 第三步,生成DLL文件
        步骤一,到cmd下,运行C:\Program Files\Microsoft Visual Studio\VB98 目录下的LINK2.exe,链接代码为:
LINK2.exe "D:\LINKOBJ\Class1.obj" "D:\LINKOBJ\Module1.obj" "D:\LINKOBJ\VBStardDLL.obj" "c:\Program Files\Microsoft Visual StudioVC\VB98\VBAEXE6.LIB" /ENTRY:__vbaS /EXPORT:mathAdd /EXPORT:mathIncremente /OUT:"D:\LINKOBJ\VBStardDLL.dll" /BASE:0x11000000 /SUBSYSTEM:WINDOWS,4.0 /VERS       至此已在目录 D:\LINKOBJ下生成了 VBStardDLL.dll 的文件。
   第四步,测试

         新建一个标准exe工程,在一个module中做如下声明:

Public Declare Function mathAdd Lib "D:\LINKOBJ\VBStardDLL.dll" (ByVal val1 As Long, ByVal val2 As Long) As Long
Public Declare Function mathIncremente Lib "D:\LINKOBJ\VBStardDLL.dll" (ByVal val1 As Long, ByVal val2 As Long) As Long

在一个form里面,两个按钮:

Private Sub Command1_Click()
    Dim val11 As Long
    Dim val22 As Long
    Dim resu As Long
    val11 = 6
    val22 = 4
    resu = mathAdd(val11, val22)
    MsgBox resu
End Sub
Private Sub Command2_Click()
    Dim val11 As Long
    Dim val22 As Long
    val11 = 6
    val22 = 4
    Dim resu As Long
    resu = mathIncremente(val11, val22)
    MsgBox resu
End Sub

测试通过。

本文参考的博文地址:http://useway.blog.51cto.com/736087/295201

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页