精华内容
下载资源
问答
  • VB动态加载DLL资源

    千次阅读 2018-11-11 11:16:26
    VB动态加载DLL资源

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

    也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                   

    一、纯DLL资源的制作

               打开VC6.0 创建一个基于win32的动态链接库

     

    下一步中,要选择A sinmple Dll project

                 然后加载资源(注意对于超过256色的位图,VC不能编辑,不过这没关系)

        

        

    可以加载位图、图标、字符串等,这是加载后的情况

     

     

     资源添加完毕后,编译。(最好设为发布模式)

    这样,一个纯资源DLL就编译完毕了。

     二、VB动态调用资源DLL

               调用很简单,源码如下:

    '*************************************************************************
    '**                   叶帆源码     CSDN:yefanqiu
    '**-----------------------------------------------------------------------
    '**叶帆Blog:http://blog.csdn.net/yefanqiu
    '*************************************************************************
    Option Explicit

    Private Const IDS_STRING1     As Long = 1
    Private Const IDS_STRING2     As Long = 2
    Private Const IDS_STRING3     As Long = 3
    Private Const IDI_ICON1       As Long = 101
    Private Const IDB_BITMAP1     As Long = 102
    Private Const IDB_BITMAP2     As Long = 103

    Private Const DST_BITMAP = 4
    Private Const OBJ_BITMAP = 7

    '位图结构
    Private Type BITMAPINFOHEADER '40 bytes
            biSize As Long
            biWidth As Long
            biHeight As Long
            biPlanes As Integer
            biBitCount As Integer
            biCompression As Long
            biSizeImage As Long
            biXPelsPerMeter As Long
            biYPelsPerMeter As Long
            biClrUsed As Long
            biClrImportant As Long
    End Type
    Private Type RGBQUAD
            rgbBlue As Byte
            rgbGreen As Byte
            rgbRed As Byte
            rgbReserved As Byte
    End Type
    Private Type BITMAPINFO
            bmiHeader As BITMAPINFOHEADER
            bmiColors As RGBQUAD
    End Type

    Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
    Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
    Private Declare Function LoadString Lib "user32" Alias "LoadStringA" (ByVal hInstance As Long, ByVal wID As Long, ByVal lpBuffer As String, ByVal nBufferMax As Long) As Long
    Private Declare Function LoadBitmap Lib "user32" Alias "LoadBitmapA" (ByVal hInstance As Long, ByVal lpBitmapName As Long) As Long
    Private Declare Function LoadIcon Lib "user32" Alias "LoadIconA" (ByVal hInstance As Long, ByVal lpIconName As Long) As Long
    Private Declare Function GetObjectType Lib "gdi32" (ByVal hgdiobj As Long) As Long
    Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
    Private Declare Function DrawIcon Lib "user32" (ByVal hDC As Long, ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Long
    Private Declare Function DrawState Lib "user32" Alias "DrawStateA" (ByVal hDC As Long, ByVal hBrush As Long, ByVal lpDrawStateProc As Long, ByVal lParam As Long, ByVal wParam As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal n3 As Long, ByVal n4 As Long, ByVal un As Long) As Long
    Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

    '*************************************************************************
    '**函 数 名:LoadRes
    '**输    入:无
    '**输    出:无
    '**功能描述:资源加载
    '**全局变量:
    '**调用模块:
    '**作    者:叶帆
    '**日    期:2005-03-15 12:27:34
    '**修 改 人:
    '**日    期:
    '**版    本:V1.0.0
    '*************************************************************************
    Private Sub LoadRes()
        Dim hRes As Long
        Dim strData As String
        Dim hBmp As Long
        Dim hIcon As Long
        Dim bitBmp As BITMAPINFO
      
        '加载DLL
        hRes = LoadLibrary(Combo1.Text)
             
        '字符串
        strData = Space(255)
        LoadString hRes, IDS_STRING1, strData, 255
        Label1(0).Caption = Trim(strData)
       
        strData = Space(255)
        LoadString hRes, IDS_STRING2, strData, 255
        Label1(1).Caption = Trim(strData)

        strData = Space(255)
        LoadString hRes, IDS_STRING3, strData, 255
        Label1(2).Caption = Trim(strData)
          
        '位图
        hBmp = LoadBitmap(hRes, IDB_BITMAP1)
        If GetObjectType(hBmp) = OBJ_BITMAP Then
          GetObject hBmp, Len(bitBmp), bitBmp
          DrawState Picture1(0).hDC, 0, ByVal 0, hBmp, 0, 0, 0, bitBmp.bmiHeader.biWidth, bitBmp.bmiHeader.biHeight, DST_BITMAP
        End If
       
        '图标
        hIcon = LoadIcon(hRes, IDI_ICON1)
        DrawIcon Picture1(1).hDC, 0, 0, hIcon
       
        '释放资源
        DeleteObject hBmp
        DeleteObject hIcon
       
        '释放DLL
        FreeLibrary hRes
    End Sub

    '*************************************************************************
    '**函 数 名:Combo1_Click
    '**输    入:无
    '**输    出:无
    '**功能描述:更换DLL
    '**全局变量:
    '**调用模块:
    '**作    者:叶帆
    '**日    期:2005-03-15 12:28:49
    '**修 改 人:
    '**日    期:
    '**版    本:V1.0.0
    '*************************************************************************
    Private Sub Combo1_Click()
       LoadRes
    End Sub

    '*************************************************************************
    '**函 数 名:Form_Load
    '**输    入:无
    '**输    出:无
    '**功能描述:初始化
    '**全局变量:
    '**调用模块:
    '**作    者:叶帆
    '**日    期:2005-03-15 12:28:58
    '**修 改 人:
    '**日    期:
    '**版    本:V1.0.0
    '*************************************************************************
    Private Sub Form_Load()
        Combo1.ListIndex = 0
        LoadRes
    End Sub

    '*************************************************************************
    '**函 数 名:Picture1_Paint
    '**输    入:Index(Integer) -
    '**输    出:无
    '**功能描述:刷新
    '**全局变量:
    '**调用模块:
    '**作    者:叶帆
    '**日    期:2005-03-15 12:29:03
    '**修 改 人:
    '**日    期:
    '**版    本:V1.0.0
    '*************************************************************************
    Private Sub Picture1_Paint(Index As Integer)
        LoadRes
    End Sub

            运行后的界面:

      

      运行后的界面:

      

         源码下载地址:http://www.sky-walker.com.cn/yefan/sourcecode/dllres.rar

     

               

    给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

    这里写图片描述
    展开全文
  • vb6之CoCreateInstanceEx加载Com对象中国第一个,其他下载的全是VC++等代码,外国网站不让访问,我们百度能搜到的全是旧信息,中国这样怎么发展?
  • vb6可以做标准DLL方法很简单,利用了一个微软未公开的方法。不需要LINK工具。牛人还可以把DLL加上多线程等功能,再加上VB头初始化,VB6标准DLL就无所不能了。 VB6做的控件,又是标准DLL,又是COM对象,还可以单文件...
  • vb调用dll的各种方法

    2019-01-20 00:53:56
    vb调用dll的各种方法,便于开发VB的高级编程。 为广大编程爱好者,方便提高编程水平。
  • VB.NET插件开发模式,完整的DEMO,已经很完善,反射加载DLL
  • vb.net调用DLL示例

    2016-05-11 23:01:17
    vb.net调用一个多功能的DLL示例
  • VS2010使用VB.NET调用C++的DLL例子, 内含一个C++范例程序和一个VB.NET调用范例。
  • vb添加dll函数

    2015-06-26 19:56:24
    可以实现VB封装的DLL文件类似API那样调用
  • VB 应用最新SQLite3.DLL动态库的方法

    热门讨论 2012-08-29 17:41:56
    这是一个展示VB应用SQLite3.DLL动态库方法的源码例子,里面同时包含SQLite3.7.13动态库文件。应用方法和模块源码并非我的原创,我只是在共享源码的基础上修改,以展示应用SQLite3.DLL的运行效果。 SQLite3.DLL动态库...
  • 注意:下面的Dll文件必须是用托管代码写的,否则请使用API的相应函数进行动态加载。 一、 比如我事先写了一个类,如下: Public Class TestClass  Public Function Add(ByVal add1 As Integer, ByVal add2 ...

    注意:下面的Dll文件必须是用托管代码写的,否则请使用API的相应函数进行动态加载。

    一、

    比如我事先写了一个类,如下:

    Public Class TestClass

        Public Function Add(ByVal add1 As IntegerByVal add2 As IntegerAs Integer

            Return add1 + add2

        End Function

    End Class

    然后编译成了ClassDll.dll文件.

    二、

    在另一个程序中,我写入了如下代码

    Public Function Add(ByVal add1 As IntegerByVal add2 As IntegerAs Integer

            Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile("ClassDll.dll")

            Dim classtemp As Type = asm.GetType("ClassDll.TestClass") '区分大小写,wenjian ming bu neng xiangtong

            Dim obj As Object = asm.CreateInstance(classtemp.FullName)

            Dim me_Info As System.Reflection.MethodInfo = classtemp.GetMethod("Add")

            Dim paramter(1) As Object

            paramter(0) = add1

            paramter(1) = add2

            Return me_Info.Invoke(obj, paramter)

        End Function

    执行上面的Add函数其功能和执行一中的Add函数是一样的。


    当然,执行上面的函数的另一种方法是:(之前我用上面的方法反射执行一个exe文件里的函数时,总是失败,但是按照下面的方法就可以成功执行,你要是遇到问题时,不妨按照下面的方法试一试)

    Public Function Add(ByVal add1 As IntegerByVal add2 As IntegerAs Integer

            Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile("ClassDll.dll")

            Dim classtemp As Type = asm.GetType("ClassDll.TestClass")

            Dim obj As Object = asm.CreateInstance(classtemp.FullName)

            Return CallByName(obj, "Add", vbMethod,add1,add2)'这里特别注意CallByName的用法

        End Function

    1、上面的 System.Reflection.Assembly.LoadFile("ClassDll.dll")这一句里的ClassDll.dll是我们编译的那个dll文件。如果其不是放在程序目录下,这里必须换成ClassDll.dll的绝对路径。

    2、Dim classtemp As Type = asm.GetType("ClassDll.TestClass")这里的ClassDll.dll.TestClass类为什么不是我们定义的那个TestClass类呢(ClassDll.dll是我们的dll名称),你自己打开那个dll文件看一下就知道答案了。即我们用的时候类的前面必须加上我们的dll的名称再加一个点,才构成我们的类。

    3、paramter是我们函数要接收的参数。可以通过paramter来传递数据。

     

    经测试,在wince下同样适用


    同样,如何捕捉触发事件

    classtemp.GetType().AddEventHandler(obj, AddressOf obj_Timer)

    ...

    Sub obj_Timer()
        ' Here to deal with the timer event of your object's instance.
    End Sub

    (IDutyDao)Assembly.Load(m_path).CreateInstance(className);
    上述代码表示使用缺省无参数的构造函数创建一个对象实例,如果要在创建对象实例的时候调用有参数的构造函数该如何实现呢?

    考帮助文档使用重载的CreateInstance方法来创建对象实例的代码如下:

    (IDutyDao)Assembly.Load(m_path).CreateInstance(className, falseBindingFlags.Public,null,
    new object[] { dataSource }, nullnull);
    

    结果不行,报错:

    System.MissingMethodException: System.MissingMethodException: 未找到类型

    “ToTop.CSIM.DAL.DaoSqlServerImpl.DutyDaoImpl”上的构造函数。

    经过多次尝试和网上搜索均未果,找到的都是一些提出遇到了同样问题却没有解决办法的帖子,最后静下心来详细查看该重载方法的帮助文档,

    发现第三个参数有文章,将代码调整如下:

    (IDutyDao)Assembly.Load(m_path).CreateInstance(className, false,
    BindingFlags.Public | BindingFlags.CreateInstance, nullnew object[] { dataSource },nullnull);

    结果还不行,报同样的错误,于是只保留BindingFlags.CreateInstance继续测试,将代码调整如下:

    (IDutyDao)Assembly.Load(m_path).CreateInstance(className, false,BindingFlags.CreateInstance,
    nullnew object[] { dataSource }, nullnull);
     
    

    上述代码测试通过!

    上述方法中的具体参数说明可参阅帮助文档。

     

    在使用.NET创建的程序或组件时,元数据(metadata)和代码(code)都存储于“自成一体”的单元中,这个单元称为装配件。我们可以在程序运行期间访问这些信息。
     
    在System.Reflection中有这样一个class————Assembly,我们可以通过它来加载一个装配件。方法如下:
    Assembly assm=Assembly.LoadFrom(fileName);
    其中filename是要加载的装配件的文件名称(带路径)。
    接下来,我们就可以通过使用System.Reflection内提供的Info classes来获取装配件中的信息了。首先让我们看一下这些Info classes:
    MethodInfo 获取某个“成员函数”的信息,并提供对此“成员函数”元数据的访问。
    ParameterInfo 获取某个“参数”的信息,并提供对此“参数”元数据的访问。
    Constructorinfo 获取某个“构造函数”的信息,并提供对此“构造函数”元数据的访问。
    PropertyInfo 获取某个“属性”的信息,并提供对此“属性”元数据的访问。
    FieldInfo 获取某个“数据成员”的信息,并提供对此“数据成员”元数据的访问。
    EventInfo 获取某个“事件”的信息,并提供对此“事件”元数据的访问。
    上面列出的这些classes(除ParameterInfo外)的访问操作,要通过一个Type对象来完成。比如我们要获得一个装配件的“成员函数”就要这样做:
    System.Reflection.Assembly ass=System.Reflection.Assembly.LoadFrom(fileName);
    Type[] tp=ass.GetTypes();
    System.Reflection.MethodInfo[] mi=tp[0].GetMethods();
    使用同样的方法我们还可以得到其它的信息,如下:
    获得“构造函数”信息:System.Reflection.ConstructorInfo[] ci=tp[0].GetConstructors();
    获得“属性”信息:System.Reflection.PropertyInfo[] pi=tp[0].GetProperties();
    获得“数据成员”信息:System.Reflection.FieldInfo[] fi=tp[0].GetFields();
    获得“事件”信息:System.Reflection.EventInfo[] ei=tp[0].GetEvents();
    此外,我们可以通过ParameterInfo类来获取“成员函数”和“构造函数”的参数信息,如下:
    获取“成员函数”的参数信息:System.Reflection.ParameterInfo[] pi=mi[0].GetParameters();
    获取“构造函数”的参数信息:System.Reflection.ParameterInfo[] pi=ci[0].GetParameters();
    ParameterInfo类有两个重要的属性:Name和ParameterType。通过它们我们可以得到“参数”的名称和数据类型。
    由于.NET将class的信息以“元数据”的形式封装在程序或是组件中,又提供了一系列可以获取“元数据”的方法,所以我们可以程序运行期间来动态的访问这些信息。

    以下摘自百度:http://zhidao.baidu.com/question/294391411.html
    个人肤浅理解,反射实际上就是得到程序集中的属性和方法.
    实现步骤:
    1,导入using System.Reflection;
    2,Assembly.Load("程序集")加载程序集,返回类型是一个Assembly
    3,   foreach (Type type in assembly.GetTypes())
                {
                    string t = type.Name;
                }
       得到程序集中所有类的名称
    4,Type type = assembly.GetType("程序集.类名");获取当前类的类型
    5,Activator.CreateInstance(type); 创建此类型实例
    6,MethodInfo mInfo = type.GetMethod("方法名");获取当前方法
    7,mInfo.Invoke(null,方法参数);

    展开全文
  • 自从会vb用调用动态库函数以来,我一直在想:如何动态的调用dll里的函数?网上有一个用CallWindowProc函数的方法,不过我还是喜欢自己有个办法.今天工夫不负有心人,我终于把我心中一直想的办法给实现了,干脆就往自己的...

    自从会vb用调用动态库函数以来,我一直在想:如何动态的调用dll里的函数?网上有一个用CallWindowProc函数的方法,不过我还是喜欢自己有个

    办法.今天工夫不负有心人,我终于把我心中一直想的办法给实现了,干脆就往自己的空间上贴吧.错误的地方,希望可以得到有这方面的师傅给以

    指正,以求进步!对于系统api我没有尝试,如果调用约定相符,应该适用于对系统api的调用.
    我自己用c写个dll,然后在vb里写了这个类.
    以下代码只是我简单的实现,主要的是看实现的道理.
    vc代码:
    ///
    '我把dll文件名命名为:dll
    #include <Windows.h>
    #include <stdlib.h>
    #include <string.h>
    #include "stdafx.h"

    BOOL APIENTRY DllMain( HANDLE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
                         )
    {
          return TRUE;
    }

    extern "C" BOOL _declspec(dllexport) add(int a)
    {
            MessageBoxA(NULL,"运行在dll里!","成功",MB_OK);
            a=999;
            return 1;
    }
    ///
    vb代码:
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '类代码:
    Private 状态标志 As Boolean
    Private 模块句柄 As Long
    Private 本地函数地址备份(0 To 4) As Byte
    Private 被替换函数的地址 As Long

    Public Function 替换函数地址(模块名 As String, 函数名 As String, 本地函数地址 As Long) As Boolean       
           
            If 0 = 本地函数地址 Then
                   替换函数地址 = 0
                   Exit Function
            End If       
            被替换函数的地址 = 替换函数地址
           
            Dim 函数地址 As Long
            Dim a As Long
            Dim 跳转指令(0 To 4) As Byte      
            '加载模块
            模块句柄 = LoadLibrary(模块名)
            If 0 <> 模块句柄 Then
                    '状态标志 = 1
            Else:
                    替换函数地址 = 0
                    Exit Function
            End If
           
            '检索函数地址
            函数地址 = GetProcAddress(ByVal 模块句柄, ByVal 函数名)
            If 0 <> 函数地址 Then
                    '状态标志 = 1
            Else
                    替换函数地址 = 0
                    Exit Function
            End If
           
            '计算跳转地址
            a = 函数地址 - (本地函数地址 + 5)
           
            '构造跳转地址
            跳转指令(0) = 233
            a = WriteProcessMemory(-1, ByVal VarPtr(跳转指令(1)), ByVal VarPtr(a), 4, 0)
            If 0 = a Then
                  替换函数地址 = 0
                  Exit Function
            End If
           
            '先备份本地函数入口指令
            a = WriteProcessMemory(-1, ByVal VarPtr(本地函数地址备份(0)), ByVal 本地函数地址, 5, 0)
            If 0 = a Then
                  替换函数地址 = 0
                  Exit Function
            End If
           
            '写入跳转指令
            a = WriteProcessMemory(-1, ByVal 本地函数地址, ByVal VarPtr(跳转指令(0)), 5, 0)
            If 0 = a Then
                  替换函数地址 = 0
                  Exit Function
            Else:
                  状态标志 = 1
                  替换函数地址 = 1
            End If
           
    End Function

    Public Function 还原函数地址() As Boolean

            If 0 = 状态标志 Then
                   还原函数地址 = 0
                   Exit Function
            End If
           
            Dim a As Long
            a = WriteProcessMemory(-1, ByVal 被替换函数的地址, ByVal VarPtr(本地函数地址备份(0)), 5, 0)
            If 0 = a Then
                  还原函数地址 = 0
                  Exit Function
            Else:
                  状态标志 = 0
                  还原函数地址 = 1
            End If
            FreeLibrary 模块句柄
           
    End Function

    Public Function 当前状态() As Boolean
            当前状态 = 状态标志
    End Function
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'vb普通模块代码:
    '读写内存的api函数
    Public Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal _
           lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long

    '加载模块的api函数
    Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long

    '检索模块里函数地址的api函数
    Public Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long

    '
    Public Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long

    '模拟一个函数与dll里,我们想调用函数类型和参数一致, 用类将函数的地址替换
    Public Function 测试函数(参数 As Long) As Boolean
           '我们随便给返回0,因为这个指令将不会被程序执行到
           测试函数 = 0
    End Function
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'vb窗口模块代码:
    Private Sub Form_Load()
            Dim 模块名 As String, 函数名 As String
            模块名 = App.Path + "/dll.dll"
            '模块名现在可以自己定了,自由了!
            函数名 = "add"
            Dim p As Boolean
            Dim aa As New Class1
            p = aa.替换函数地址(模块名, 函数名, AddressOf 测试函数)
            If p Then
                 测试函数 0
                 '将会弹出对话筐:运行在dll里!
                 aa.还原函数地址
            End If
    End Sub
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

     

     

     


     

    展开全文
  • VB静态调用与动态调用dll详解

    千次阅读 2013-12-23 17:35:42
    【【请注意】】:在以下语法格式中,请注意 [函数名] 的【大小写】!!! ... 就是常用的申明API,一个DLL库里有很多的函数可供调用,把要用的申明即可。  比如:Public/Private Declare Functio

    【【请注意】】:在以下语法格式中,请注意 [函数名] 的【大小写】!!!

    静态与动态比较:

        静态调用简单,动态调用麻烦;静态调用占用资源多,动态调用占用资源少;正所谓鱼和熊掌不可兼得。


    静态调用定义:

        就是常用的申明API,一个DLL库里有很多的函数可供调用,把要用的申明即可。
        比如:Public/Private Declare Function [函数名] Lib "DLL文件名" [Alias "别名"] (参数变量表) [As 返回值的数据类型]
        示例:Private Declare Function Test Lib "dll.dll" (x As String) As String
        当程序结束的时候系统回自动释放DLL调用。


    动态调用定义:

        使用LoadLibery(DLL名),系统会检查DLL是否调入内存。如果调入了,可直接调用DLL里的所有函数,没有就会把DLL加入目标进程的进程空间。通过函数GetProcAddress确定函数入口地址,然后调用,后一种方法VB里不常用的。


    静态调用详解:

        制作好DLL之后,首先用Declare声明语句在窗体级或模块级或全局模块的代码声明段进行声明,将动态链接库中的函数声明到VB中,供VB程序调用。

        语法格式1:
            Public/Private Declare Sub [函数名] Lib "DLL文件名" [Alias "别名"] (参数变量表)

        语法格式2:
            Public/Private Declare Function [函数名] Lib "DLL文件名" [Alias "别名"] (参数变量表) [As 返回值的数据类型]

        在声明中首先用Declare关键字表示声明DLL中的函数。在C语言中有的函数类型为VOID,它表示不具有返回值,则必须用关键字Sub将其声明成过程。有的函数具有返回值,则必须用关键字Function将其声明成函数,并且在声明语句的最后要用AS关键字指明函数返回值的类型。

        例如add.DLL在VB中就可以声明为:
            Declare Function ADD Lib "c:\add.dll" (ByVal X AS Integer, ByVal Y AS Integer, ByVal filein as string) AS Integer

        通过此声明语句将函数ADD声明到VB中,便可直接调用。


    动态调用详解:

        首先调用API LoadLibaray 装载dll,然后调用API GetProcAddress 得到dll的对应方法的地址。因为vb不像其他的有函数指针,在vb中声明函数原形,怎样把得到的函数地址赋给这个原形有些麻烦。

    解决办法1:

    Option Explicit 
     
    '我们要调用没有声明的API(dll)的功能! 
    Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long '释放LoadLibrary载入的动态链接库,非零表示成功,零表示失败。 
    Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long '载入指定动态链接库,成功则返回库模块的句柄,零表示失败。 
    Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long '检索指定的动态链接库(DLL)中的输出库函数地址(超找函数入口地址),成功则返回值是DLL中的输出函数地址,失败返回值是NULL。 
    Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long '将消息信息传送给指定的窗口过程。 
     
    Private Sub Form_Load() 
        Dim LibHand As Long '载入的dll句柄 
        LibHand = LoadLibrary("user32")     '将user32载入到内存。 
        CallWindowProc GetProcAddress(LibHand, "SetWindowTextA"), Me.hWnd, CStr(Now), ByVal 0&, ByVal 0& '调用SetWindowTextA函数功能 
        FreeLibrary LibHand '释放映射库的地址 
    End Sub


    解决办法2:
     
    下面是动态调用MessageBoxA的源代码,上面的步骤被封装到RunDll32函数中,可放到模块(CallAPIbyName.bas)中: 
        Dim s1() As Byte, s2()   As Byte 
        Const hWnd = 0 
        Dim ret  As Long 
        s1 = StrConv("Hello~World", vbFromUnicode) 
        s2 = StrConv("VBNote", vbFromUnicode) 
        ret = RunDll32("user32", "MessageBoxA", hWnd, VarPtr(s1(0)), VarPtr(s2(0)), 0&) 
    End Sub 
     
    Public Function RunDll32(LibFileName As String, ProcName As String, ParamArray Params()) As Long 
        Dim hProc As Long 
        Dim hModule As Long 
        ReDim m_OpCode(400 + 6 * UBound(Params))    '保留用来写m_OpCode 
        hModule = LoadLibrary(ByVal LibFileName)    '读取API库 
        If hModule = 0 Then 
    MsgBox "Library读取失败!" 
    Exit Function 
        End If 
        hProc = GetProcAddress(hModule, ByVal ProcName)     '取得函数地址 
        If hProc = 0 Then 
    MsgBox "函数读取失败!", vbCritical 
    FreeLibrary hModule 
    Exit Function 
        End If 
        RunDll32 = CallWindowProc(GetCodeStart(hProc, Params), 0, 1, 2, 3)  '执行Assembly   Code部分 
        FreeLibrary hModule '释放空间 
    End Function

    解决办法3:

    在VB中嵌入汇编实现。loadlibary取得DLL,GetProcAddress取得函数地址,用VB嵌入汇编的写法压所需参数,CallWindowProc调用GetProcAddress返回的地址。

    本文“【VB技巧】VB静态调用与动态调用dll详解”,来自:Nuclear'Atk 网络安全研究中心

    展开全文
  • 通过http://www.vbsqlite.com.ar/archive/file.php?id=28 ...上面的例子进行改进,测试通过了VB+Sqlite3.dll文件进行数据库基础操作和读写图片文件,非com控件,无需注册,采用unicode,省去了UTF8编码的麻烦!
  • 环境2.dll编译 1.环境 VS2010 win7 sp1 x64 小插曲,第一次用VB的可以看看下面链接和C差不多。迫于工程需要,我也是第一次用。 主要用法。 定义变量 Dim a as String // 定义一个名为 a 的 String 变量。 与java...
  • VB6.0引用Excel时出现加载DLL错误

    千次阅读 2019-05-22 10:41:29
    今天在VB引用Excel时,由于换了一个虚拟机,出现了在引用的时候出现加载DLL错误。 事实上这里的可用引用有时候是错的,可能是之前装过的office残留,或者其他什么的,我暂时没有搞清楚原因,解决方法就是找到你...
  •  _________________下载原码:____________________________ -注意:全包括二部分,一定要下载完后...ReadDLL-VB.NET.part2.rar 1.3MB  ReadDLL-VB.NET.part1.rar 1.9MB  下载地址:http://kevery.ys168.co
  • 同时还阔以解决System.DllNotFoundException: 无法加载 DLL“SQLite.Interop.DLL”问题。 判断32位进程还是64位进程可以用 Environment.Is64BitProcess 资源全部来自官网...
  • vb.net 调用DLL

    2013-07-14 01:25:14
    vb.net 调用DLL 描述如何用vb调用DLL
  • VB中创建的DLL只是COM组件,无法作为输出函数的DLL,其实这是MS非常狡猾的手段...
  • VB编译api DLL

    2014-03-25 14:42:45
    vb用户可以根据这个辅助软件来编译具有导出函数的DLL文件,同时免去了作为组件的引用上的烦劳,只需要像API那样声明一下就可以实现了,就算升级dll也不需要添加什么组件了,当然在vb上这个dll就完全类似系统的一些DLL,...
  •  建立ActiveX dll程序,添加一个模块(DLL的函数只能在模块中才有效),在模块中编写你的DLL function过程函数,编写完毕,点保存,然后点"文件"菜单下的”选择DLL出口函数",在弹出窗口中选择需要申明为可以外部调用...
  • 本文亮点:无需使用...静态加载所谓静态加载,是指你在编码时就知道DLL文件的位置,用户有义务保证运行时可以在那个固定的、不允许变更的位置找到DLL文件。这种情况可以使用简单的静态调用。静态调用十分简单,官...
  • VB如何调用DLL

    千次阅读 2014-04-21 16:09:22
    Windows动态连接库是包含数据和函数的模块,可以被其它可执行文件(EXE、DLL、OCX 等)调用。动态连接库包含两种函数:输出(exported)函数和内部(internal)函数。输出函数可以被其它模块调用,而内部函数则只能...
  • vb.net中如何创建和调用DLL

    千次阅读 2019-12-16 11:23:49
    注意:根据测试,按以下方法创建和调用的DLL只能使用在“.NETFramework”框架的应用中(在创建项目时有显示) 新建一个项目 选择类库(.NET Framework) 打开后写入代码: Public Class ClassV Private V1 ...
  • 直接用VB6代码生成二维码,我也把代码做成了控件的方式,方便添加到工程随意使用。 看到CSDN有个同类功能上传,竟然要44积分,太黑了,CSDN管理员,看我的要多少积分? VB生成二维码图形的控件,非常好用,含使用范例...
  • 摘要:VB源码,控件组件,控件注册 VB控件注册程序,动态加载控件并进行注册,支持DLL/OCX类型控件通过本程序来注册,返回处理结果。 运行环境:Windows/VB6
  • VB调用DLL资源文件

    2011-11-05 14:52:28
    将项目图片、文字等使用VC++编写资源文件DLL提供给VB调用
  • 解决vb连接sqlite3.dll报错,安装32版本驱动程序解决,在VB工程添加连接字串DRIVER=SQLite3 ODBC Driver;Database=处理
  • LISP调用VB写的DLL教程

    2009-02-26 22:27:30
    LISP调用VB写的DLL教程,扩展lisp功能的教材。。。。。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,926
精华内容 9,570
关键字:

vb动态加载dll