精华内容
下载资源
问答
  • 用vb写的md5源码dll,还有VB使用DLL源码
  • 使用VC编写VB使用DLL

    2010-02-08 14:49:00
    使用VC编写VB使用DLL一、在函数定义前必须加上extern "c",_stdcall关键字。 extern "C" int _stdcall Sum(int x,int y) { return x+y; } 二、DLL的.def文件中必须加上入口函数 EXPORTS sample @1 sample是你...

    使用VC编写VB使用DLL

    一、在函数定义前必须加上extern "c",_stdcall关键字。
     extern "C" int _stdcall Sum(int x,int y)
     {
      return x+y;
     }
     
    二、DLL的.def文件中必须加上入口函数
        EXPORTS
         sample @1
        
     sample是你要在VB中调用的函数名,@1表示该函数在DLL中的编号
     
    三、要注意DLL中的函数和VB中的函数声明在名称、返回类型、参数类型、参数个数等方面必须完全相同,尤其要注意大小写的问题。

    注意事项:
     1、必须保证VB和VC的参数个数相同,参数所占字节数也一致

    3.数组参数在DLL中的传递
      由于DLL经常用来进行一些底层的运算操作,因此应用程序常需要传递大量的数据给DLL。在C++中,指针是进行数组操作的最佳选择,但VB中没有指针的概念。这通常可用两种方法来解决。
      其一,在VB中声明DLL时,用byref来代替byval,即可将数组指针传递给DLL。
      另外,将数组声明为变体型(variant),即可直接将数组传递给DLL。

    四、在vb中声明("dllTest.dll" 使用的是相对路径,你可以将dll.dll放到.exe所在的目录或系统目录),函数名大小敏感

    Private Declare Function Sum Lib "dllTest.dll" (ByVal x As Long, ByVal y As Long) As Long

    五、例子
     1、新建一个win32 dynamic library,空的工程
     2、新建一个dllTest.cpp 文件,并添加到工程。内容如下

     // dll4.cpp : Defines the entry point for the DLL application.
    //

    #include "stdafx.h"

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

    extern "C" int _stdcall Sum(int x,int y)
    {
     return x+y;
    }
    extern "C" int _stdcall GetNum(int Num)      /*具体实现*/
    {
     return Num;    
    }

     3,新建一个dllTest.def文件,并添加到工程。内容如下:
     EXPORTS   
             Sum @1 
     
     
     相关知识点:
     
     1)  函数调用约定(Calling Convention)
      
     c++编译器
     
        编译器的命令行参数是/Gz,__stdcall是Pascal程序的缺省调用方式,大多数Windows的API也是__stdcall调用约定。__stdcall函数调用约定将函数参数从右向左入栈,除非使用指针或引用类型的参数,所有参数采用传值方式传递,由被调用函数负责清除栈中的参数。对于C函数,__stdcall的名称修饰方式是在函数名字前添加下划线,在函数名字后添加@和函数参数的大小,例如:_functionname@number
     函数名字修饰(Decorated Name)方式

        函数的名字修饰(Decorated Name)就是编译器在编译期间创建的一个字符串,用来指明函数的定义或原型。LINK程序或其他工具有时需要指定函数的名字修饰来定位函数的正确位置。多数情况下程序员并不需要知道函数的名字修饰,LINK程序或其他工具会自动区分他们。当然,在某些情况下需要指定函数的名字修饰,例如在C++程序中,为了让LINK程序或其他工具能够匹配到正确的函数名字,就必须为重载函数和一些特殊的函数(如构造函数和析构函数)指定名字装饰。另一种需要指定函数的名字修饰的情况是在汇编程序中调用C或C++的函数。如果函数名字,调用约定,返回值类型或函数参数有任何改变,原来的名字修饰就不再有效,必须指定新的名字修饰。C和C++程序的函数在内部使用不同的名字修饰方式,下面将分别介绍这两种方式。

    1. C编译器的函数名修饰规则

        对于__stdcall调用约定,编译器和链接器会在输出函数名前加上一个下划线前缀,函数名后面加上一个“@”符号和其参数的字节数,例如_functionname@number。__cdecl调用约定仅在输出函数名前加上一个下划线前缀,例如_functionname。__fastcall调用约定在输出函数名前加上一个“@”符号,后面也是一个“@”符号和其参数的字节数,例如@functionname@number。   
     
    2. C++编译器的函数名修饰规则

        C++的函数名修饰规则有些复杂,但是信息更充分,通过分析修饰名不仅能够知道函数的调用方式,返回值类型,参数个数甚至参数类型。不管__cdecl,__fastcall还是__stdcall调用方式,函数修饰都是以一个“?”开始,后面紧跟函数的名字,再后面是参数表的开始标识和按照参数类型代号拼出的参数表。对于__stdcall方式,参数表的开始标识是“@@YG”,对于__cdecl方式则是“@@YA”,对于__fastcall方式则是“@@YI”。参数表的拼写代号如下所示:
    X--void   
    D--char   
    E--unsigned char   
    F--short   
    H--int   
    I--unsigned int   
    J--long   
    K--unsigned long(DWORD)
    M--float   
    N--double   
    _N--bool
    U--struct
    ....
    指针的方式有些特别,用PA表示指针,用PB表示const类型的指针。后面的代号表明指针类型,如果相同类型的指针连续出现,以“0”代替,一个“0”代表一次重复。U表示结构类型,通常后跟结构体的类型名,用“@@”表示结构类型名的结束。函数的返回值不作特殊处理,它的描述方式和函数参数一样,紧跟着参数表的开始标志,也就是说,函数参数表的第一项实际上是表示函数的返回值类型。参数表后以“@Z”标识整个名字的结束,如果该函数无参数,则以“Z”标识结束。下面举两个例子,假如有以下函数声明:


    int Function1(char *var1,unsigned long);
    其函数修饰名为“?Function1@@YGHPADK@Z”,而对于函数声明:
    void Function2();
     其函数修饰名则为“?Function2@@YGXXZ” 。
     

        对于C++的类成员函数(其调用方式是thiscall),函数的名字修饰与非成员的C++函数稍有不同,首先就是在函数名字和参数表之间插入以“@”字符引导的类名;其次是参数表的开始标识不同,公有(public)成员函数的标识是“@@QAE”,保护(protected)成员函数的标识是“@@IAE”,私有(private)成员函数的标识是“@@AAE”,如果函数声明使用了const关键字,则相应的标识应分别为“@@QBE”,“@@IBE”和“@@ABE”。如果参数类型是类实例的引用,则使用“AAV1”,对于const类型的引用,则使用“ABV1”。下面就以类CTest为例说明C++成员函数的名字修饰规则:


    class CTest
    {
    ......
    private:
        void Function(int);
    protected:
        void CopyInfo(const CTest &src);
    public:
        long DrawText(HDC hdc, long pos, const TCHAR* text, RGBQUAD color, BYTE bUnder, bool bSet);
        long InsightClass(DWORD dwClass) const;
    ......
    };
     

     

    展开全文
  • vb制作DLL并引用DLL

    2019-03-04 10:36:29
    详细介绍vb制作DLL以及引用DLL的步骤流程,使用者可以清楚的了解动态链接库的使用方法
  • VB使用C的DLL

    2013-02-20 20:12:29
    VB使用C的DLL
  • 使用VB.net和VB编写DLL组件的方法

    千次阅读 2005-05-26 10:22:00
    使用ESRI 的AO进行开发的时候,最常用的开发手段之一就是写DLL组件,使用VB或者VB.NET编写DLL组件的方法是不一样的。写DLL的时候,就是继承某个接口,而接口里面的方法和属性必须完全实现,不能够有任何的遗漏。以下...

    使用ESRI 的AO进行开发的时候,最常用的开发手段之一就是写DLL组件,使用VB或者VB.NET编写DLL组件的方法是不一样的。写DLL的时候,就是继承某个接口,而接口里面的方法和属性必须完全实现,不能够有任何的遗漏。以下便是VB和VB.NET开发AO的方法:

    1.使用VB写DLL
    使用一个Icommand或者Itool来写DLL组件,例子如下:
    1.1在VB中开始一个ACTIVE DLL组件项目
    1.2使用 工程--引用,引用ESRI Core objects
    1.3代码如下:

    Option Explicit
    ' 实现ICommand interface
    Implements ICommand

    Dim m_pApp As IApplication      'ArcMap application

    Private Property Get ICommand_Bitmap() As esriCore.OLE_HANDLE
      ' The VB project contains a form called Form1.
      ' Picture1 is the name of a PictureBox control on the form.
      ' The Picture property of PictureBox1 is set to some bitmap on
      ' your system.
      ICommand_Bitmap = Form1.Picture1.Picture.Handle
    End Property

    Private Property Get ICommand_Caption() As String
      ' Set the string that appears when the command is used as a
      ' menu item.
      ICommand_Caption = "MyCommand"
    End Property

    Private Property Get ICommand_Category() As String
      ' Set the category of this command. This determines where the
      ' command appears in the Commands panel of the Customize dialog.
      ICommand_Category = "MyCustomTools"
    End Property

    Private Property Get ICommand_Checked() As Boolean

    End Property

    Private Property Get ICommand_Enabled() As Boolean
      ' Add some logic here to specify in what state the application
      ' should be in for the command to be enabled. In this example,
      ' the command is enabled only when there is at least one data
      ' layer loaded in ArcMap.
      Dim pMxDoc As IMxDocument
      Dim pLayerCount As Integer
      'm_pApp is set in OnCreate
      Set pMxDoc =  m_pApp.Document
      pLayerCount =  pMxDoc.FocusMap.LayerCount
      If pLayerCount > 0 Then
        ICommand_Enabled =  True
      Else
        ICommand_Enabled =  False
      End  If
    End Property

    Private Property Get ICommand_HelpContextID() As Long
      ICommand_HelpContextID =  1234
    End Property

    Private Property Get ICommand_HelpFile() As String
      ' If the help file is not registered you may need
      ' to  supply the  full path to the file
      ICommand_HelpFile = "MyHelp.hlp"
    End Property

    Private Property Get ICommand_Message() As String
      'Set the message string that appears in the statusbar of the
      'application when the mouse passes over the command.
      ICommand_Message = "This is my custom command"
    End Property

    Private Property Get ICommand_Name() As String
      ' Set the internal name of this command. By convention, this
      ' name string contains the category and caption of the command.
      ICommand_Name = "MyCustomTool_MyCommand"
    End Property


    Private Sub ICommand_OnClick()
      ' Add some code to do some action when the command is clicked. In this
      ' example, a message box is displayed.
      MsgBox "Clicked on my command"
    End Sub

    Private Sub ICommand_OnCreate(ByVal hook As Object)
      ' The hook argument is a pointer to Application object.
      ' Establish a hook to the application
      Set m_pApp = hook
    End Sub


    Private Property Get ICommand_Tooltip() As String
      'Set the string that appears in the screen tip.
      ICommand_Tooltip = "MyCommand"
    End Property
    1.4 编译为DLL组件,在项目--属性中修改项目名和设置二进制级兼容性。

    2.使用VB.NET编写DLL组件
    2.1 生产项目,文件--新建--项目--VB类库
    2.2 添加引用,AO在.NET项目中已经有了自己专门类,不用使用COM组件,所以引入.NET中专门的命名空间即可
    2.3.添加新项--COM类
    2.4 添加代码
    Imports System.Runtime.InteropServices
    Imports System.Windows.Forms
    Imports System.Drawing
    Imports ESRI.ArcObjects.Core
    Imports ESRI.ArcObjects.Samples.CATIDs
    '引用命名空间
    <ComClass(ToolUsingImplementsVBNET.ClassId, ToolUsingImplementsVBNET.InterfaceId, ToolUsingImplementsVBNET.EventsId)> _
    Public Class ToolUsingImplementsVBNET
      Implements ICommand
      Implements ITool

    #Region "COM GUIDs"
      Public Const ClassId As String = "8F1F6654-7FB8-491B-B50A-96EC444E5B53"
      Public Const InterfaceId As String = "E1FB3337-2BBC-42FE-B040-0EA9D42A03ED"
      Public Const EventsId As String = "E35B29D4-4FD8-4768-A4AD-4B489C202C22"
    #End Region



    #Region "Register Unregister Component"
      <ComRegisterFunction(), ComVisible(False)> _
      Public Shared Sub OnRegister(ByVal regKey As String)
        MxCommand.Register(regKey)
      End Sub

      <ComUnregisterFunction(), ComVisible(False)> _
      Public Shared Sub OnUnRegister(ByVal regKey As String)
        MxCommand.Unregister(regKey)
      End Sub
    #End Region



      Private m_app As IApplication
      Private m_bitmap As Bitmap
      Private m_hBitmap As IntPtr
      Private m_cursor As System.Windows.Forms.Cursor

      ' Needed to clear up the Hbitmap unmanaged resource
      <DllImport("gdi32.dll")> _
    Private Shared Function DeleteObject(ByVal hObject As IntPtr) As Boolean
      End Function

      Public Sub New
    ()
        MyBase.New()
        m_cursor = New System.Windows.Forms.Cursor(Me.GetType.Assembly.GetManifestResourceStream("ESRISamples.Cursor2.cur"))

        m_bitmap = New System.Drawing.Bitmap((Me.GetType.Assembly.GetManifestResourceStream("ESRISamples.happy2.bmp")))
        If Not (m_bitmap Is Nothing) Then
          m_bitmap.MakeTransparent(m_bitmap.GetPixel(1, 1))
          m_hBitmap = m_bitmap.GetHbitmap()
        End If
        ' The GetHbitmap method creates an unmanaged Windows GDI bitmap object.
        ' You have to delete this object manually because the .NET runtime garbage
        ' collector doesn't clear it up. See below.
      End Sub

      Protected Overrides Sub
    Finalize()
        ' Must de-allocate hBitmap with Windows.DeleteObject
        If (m_hBitmap.ToInt32() <> 0) Then
          DeleteObject(m_hBitmap)
        End If
      End Sub

      Public Sub
    OnClick() Implements ESRI.ArcObjects.Core.ICommand.OnClick
        ' Add some code to do some action when the command is clicked. In this
        ' example, a message box is displayed.
        MessageBox.Show("Clicked on my command.")
      End Sub

      Public Sub
    OnCreate(ByVal hook As Object) Implements ESRI.ArcObjects.Core.ICommand.OnCreate
        If TypeOf hook Is IMxApplication Then
          m_app = hook
        End If
      End Sub

      Public ReadOnly Property
    Bitmap() As Integer Implements ESRI.ArcObjects.Core.ICommand.Bitmap
        Get
          If
    (m_hBitmap.ToInt32() <> 0) Then
            Bitmap = m_hBitmap.ToInt32()
          End If
        End Get
      End Property

      Public ReadOnly Property
    Caption() As String Implements ESRI.ArcObjects.Core.ICommand.Caption
        Get
          Caption = "Tool using implements VB.NET"
        End Get
      End Property


      Public ReadOnly Property
    Category() As String Implements ESRI.ArcObjects.Core.ICommand.Category
        Get
          Category = "Developer Samples"
        End Get
      End Property

      Public ReadOnly Property
    Checked() As Boolean Implements ESRI.ArcObjects.Core.ICommand.Checked
        Get
          Checked = False
        End Get
      End Property

      Public ReadOnly Property
    Enabled() As Boolean Implements ESRI.ArcObjects.Core.ICommand.Enabled
        Get
          ' Add some logic here to specify in what state the application
          ' should be in for the command to be enabled. In this example,
          ' the command is enabled only when there is at least one data
          ' layer loaded in ArcMap.
          Dim mxDoc As IMxDocument
          Dim layerCount As Integer

          mxDoc = m_app.Document
          layerCount = mxDoc.FocusMap.LayerCount
          If layerCount > 0 Then
            Enabled = True
          Else

            Enabled = False
          End If
        End Get
      End Property

      Public ReadOnly Property
    HelpContextID() As Integer Implements ESRI.ArcObjects.Core.ICommand.HelpContextID
        Get

        End Get
      End Property

      Public ReadOnly Property
    HelpFile() As String Implements ESRI.ArcObjects.Core.ICommand.HelpFile
        Get

        End Get
      End Property

      Public ReadOnly Property
    Message() As String Implements ESRI.ArcObjects.Core.ICommand.Message
        Get
          Message = "Sample Tool using Implements VB.NET"
        End Get
      End Property

      Public ReadOnly Property
    Name() As String Implements ESRI.ArcObjects.Core.ICommand.Name
        Get
          Name = "DeveloperSamples_ToolUsingImplementsVBNET"
        End Get
      End Property

      Public ReadOnly Property
    Tooltip() As String Implements ESRI.ArcObjects.Core.ICommand.Tooltip
        Get
          Tooltip = "Tool using implements VB.NET"
        End Get
      End Property

      Public ReadOnly Property
    Cursor() As Integer Implements ESRI.ArcObjects.Core.ITool.Cursor
        Get
          If
    (Not m_cursor Is Nothing) Then
            Cursor = m_cursor.Handle.ToInt32
          End If
        End Get
      End Property

      Public Function
    Deactivate() As Boolean Implements ESRI.ArcObjects.Core.ITool.Deactivate
        Deactivate = True
      End Function

      Public Function
    OnContextMenu(ByVal X As Integer, ByVal Y As Integer) As Boolean Implements ESRI.ArcObjects.Core.ITool.OnContextMenu

      End Function

      Public Sub
    OnDblClick() Implements ESRI.ArcObjects.Core.ITool.OnDblClick

      End Sub

      Public Sub
    OnKeyDown(ByVal keyCode As Integer, ByVal Shift As Integer) Implements ESRI.ArcObjects.Core.ITool.OnKeyDown
        ' Add some code to do some action when a keyboard button is pressed.
        ' This example reports the pressed key in the statusbar message.
        m_app.StatusBar.Message(0) = "Key: " & Chr(keyCode)
      End Sub

      Public Sub
    OnKeyUp(ByVal keyCode As Integer, ByVal Shift As Integer) Implements ESRI.ArcObjects.Core.ITool.OnKeyUp

      End Sub

      Public Sub
    OnMouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Integer, ByVal Y As Integer) Implements ESRI.ArcObjects.Core.ITool.OnMouseDown
        If (Button = 1) Then
          ' Convert x and y to map units.
          Dim point As IPoint
          Dim mxApp As IMxApplication
          mxApp = m_app
          point = mxApp.Display.DisplayTransformation.ToMapPoint(X, Y)

          ' Set the statusbar message.
          m_app.StatusBar.Message(0) = point.X & "," & point.Y
        End If
      End Sub

      Public Sub
    OnMouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Integer, ByVal Y As Integer) Implements ESRI.ArcObjects.Core.ITool.OnMouseMove
        ' Add some code to do some action when the mouse is moved.
        ' This example changes the statusbar message.
        m_app.StatusBar.Message(0) = "ITool_OnMouseMove"
      End Sub

      Public Sub
    OnMouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Integer, ByVal Y As Integer) Implements ESRI.ArcObjects.Core.ITool.OnMouseUp
        ' Add some code to do some action when the mouse is released.
        ' This example changes the statusbar message.
        m_app.StatusBar.Message(0) = "ITool_OnMouseUp"
      End Sub

      Public Sub
    Refresh(ByVal hDC As Integer) Implements ESRI.ArcObjects.Core.ITool.Refresh

      End Sub
    End Class

    展开全文
  • VB调用dll的应用实例

    2014-05-02 17:31:40
    这个方法是从我的毕业设计中截取的,里面除了详细介绍...因此,适合VB与matlab混合编程使用。 这种方法是经过我实际验证的,绝对可行。之前也发过一个VB调用dll的文档,那个文档说明比较模糊,大家可以试试这个方法。
  • 教你用VB制作DLL

    2013-06-15 23:38:27
    教你用VB制作DLL,从制作到使用,再到把DLL写入系统全套教程[必须解压才能看]</H1>
  • VB调用DLL

    2015-05-13 13:59:15
    作为一种32位Windows应用程序的开发工具,VB生成的exe文件自然也都是32位的,通常情况下也只能调用32位的动态连接库。... 1、生成动态库时要使用__stdcall调用约定,而不能使用缺省的__cdecl调用约定;__stdcall 

    作为一种32Windows应用程序的开发工具,VB生成的exe文件自然也都是32位的,通常情况下也只能调用32位的动态连接库。但是,并不是所有的32位动态库都能被VB生成的exe 文件正确地识别。

    一般来说,自己编写用于VB应用程序调用的动态连接库时,应注意以下几个方面的问题:

      1、生成动态库时要使用__stdcall调用约定,而不能使用缺省的__cdecl调用约定;__stdcall 约定通常用于32API函数的调用。

      2、在VC中的定义文件(.def)中,必须列出输出函数的函数名,以强制VC系统将输出函数的装饰名(decoratedname)改成普通函数名;所谓装饰名是VC的编译器在编译过程中生成的输出函数名,它包含了用户定义的函数名、函数参数及函数所在的类等多方面的信息。由于在VC中定义文件不是必需的,因此工程不包含定义文件时VC就按自己的约定将用户定义的输出函数名修改成装饰名后放到输出函数列表中,这样的输出函数在VB生成的应用程序中是不能正确调用的(除非声明时使用Alias子句)。因此需要增加一个.def文件,其中列出用户需要的函数名,以强制VC不按装饰名进行输出。

      3VC中的编译选项"结构成员对齐方式(structure member alignment应设成4字节,其原因将在后文详细介绍。

      4、由于在C中整型变量是4个字节,而VB中的整型变量依然只有2个字节,因此在C中声明的整型(int)变量在VB中调用时要声明为长整型(long),而C中的短整型(short)在VB中则 要声明成整型(integer);下表针对最常用的C语言数据类型列出了与之等价的Visual Basic 类型(用于32位版本的Windows)。

    C语言数据类型在VisualBasic中声明为调用时使用的表达式

       ATOM ByVal variable As Integer 结果为Integer 类型的表达式

       BOOL ByVal variable As Long 结果为 Long 类型的表达式

       BYTE ByVal variable As Byte 结果为 Byte 类型的表达式

       CHAR ByVal variable As Byte 结果为 Byte 类型的表达式

       COLORREF ByVal variable As Long 结果为 Long 类型的表达式

       DWORD ByVal variable As Long 结果为 Long 类型的表达式

       HWND, HDC, HMENU ByVal variable As Long 结果为 Long 类型的表达式等Windows 句柄

       INT, UINT ByVal variable As Long 结果为 Long 类型的表达式

       LONG ByVal variable As Long 结果为 Long 类型的表达式

       LPARAM ByVal variable As Long 结果为 Long 类型的表达式

       LPDWORD variable As Long 结果为 Long 类型的表达式

       LPINT, LPUINT variable As Long 结果为 Long 类型的表达式

       LPRECT variable As type 自定义类型的任意变量

       LPSTR, LPCSTR ByVal variable As String 结果为 String 类型的表达式

       LPVOID variable As Any 任何变量(在传递字符串的时候使用ByVal

       LPWORD variable As Integer 结果为Integer 类型的表达式

       LRESULT ByVal variable As Long 结果为 Long 类型的表达式

       NULL As Any  ByVal Nothing 

       ByVal variable As Long ByVal 0&  VBNullString

       SHORT ByVal variable As Integer 结果为Integer 类型的表达式

       VOID Sub procedure 不可用

       WORD ByVal variable As Integer 结果为Integer 类型的表达式

       WPARAM ByVal variable As Long 结果为 Long 类型的表达式

    5VB中进行32位动态库的声明时,函数名是大小写敏感的。在获得了需要的动态连接 库之后,就可以在VB中进行调用了。

    下面就具体介绍一下在VB中调用API函数时需要做的工作。

    要声明一个DLL过程,首先需要在代码窗口的"通用(General"部分增加一个Declare语句。如果该过程返回一个值,应将其声明为

    Function

       Declare Function publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])] As Type 

       如果过程没有返回值,可将其声明为Sub

       Declare Sub publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])] 

      缺省情况下,在标准模块中声明的DLL过程,可以在应用程序的任何地方调用它。在其它类型的模块中定义的DLL过程则是模块私有的,必须在它们前面声明Private关键字,以示区分。下面分别介绍声明语句的各个组成部分。

    ()、指定动态库:

      Declare语句中的Lib子句用来告诉Visual Basic如何找到包含过程的.dll文件。 如果引用的过程属于Windows核心库(User32Kernel32GDI32),则可以不包含文件扩展名,如:

       Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount" () As Long 

       对于其它动态连接库,可以在Lib子句指定文件的路径:

       Declare Function lzCopy Lib "c:/windows/lzexpand.dll" _

       (ByVal S As Integer, ByVal D As Integer) As Long 

    如果未指定libname的路径,Visual Basic将按照下列顺序查找该文件:

      ①.exe文件所在的目录

      ②当前目录

      ③Windows系统目录

      ④Windows目录

      ⑤Path环境变量中的目录

      下表中列出了常用的操作系统环境库文件。

      动态链接库描述

      Advapi32.dll高级API服务,支持大量的API(其中包括许多安全与注册方面的调用)

      Comdlg32.dll通用对话框API

      Gdi32.dll图形设备接口API

      Kernel32.dllWindows32位核心的API支持

      Lz32.dll32位压缩例程

      Mpr.dll多接口路由器库

      Netapi32.dll32位网络API

      Shell32.dll32ShellAPI

      User32.dll用户接口例程库

      Version.dll版本库

      Winmm.dllWindows多媒体库

      Winspool.drv后台打印接口,包含后台打印API调用。

      对于Windows的系统API函数,可以利用VB提供的工具API Viewer查找某一函数及其相 关数据结构和常数的声明,并复制到自己的程序中。

    ()、使用别名:

    A.函数名是标准的名称

      Declare语句中的Alias子句是一个可选的部分,用户可以通过它所标识的别名对动态 库中的函数进行引用。例如,在下面的语句中,声明了一个在VB中名为MyFunction的函数,而它在动态库Mydll.dll中最初的名字是MyFunctionX

       Private Declare Function MyFunction Lib "Mydll.dll" _

       Alias "MyFunctionX" ( ) As Long 

      需要注意的是,Alias子句中的函数名是大小写敏感的,也就是说,必须与函数在生成时的声明(如在C源文件中的声明)一致。这是因为32位动态库与16位动态库不同,其中的函数名是区分大小写的。同样道理,如果没有使用Alias子句,那么在Function(或Sub)后的函数名也是区分大小写的。

    通常在以下几种情况时需要使用Alias子句:

    如果调用的系统Windows API过程要使用字符串,那么声明语句中必须增加一个Alias 子句,以指定正确的字符集。包含字符串的系统Windows API函数实际有两种格式:ANSIUnicode 关于ANSIUnicode两种字符集的区别将在后面详细阐述)。因此,在Windows头文件中,每个包含字符串的函数都同时有ANSI版本和Unicode版本。例如,下面是SetWindowText函数 的两种C语言描述。可以看到,第一个描述将函数定义为SetWindowTextA,尾部的"A" 表明它是一个ANSI函数:

       WINUSERAPI BOOL WINAPI SetWindowTextA(HWND hWnd, LPCSTR lpString); 

      第二个描述将它定义为 SetWindowTextW 尾部的"W" 表明它是一个 Unicode 函数:

       WINUSERAPI BOOL WINAPI SetWindowTextW(HWND hWnd, LPCWSTR lpString); 

      因为两个函数实际的名称都不是"SetWindowText",要引用正确的函数就必 须增加一个Alias子句:

    Private Declare Function SetWindowText Lib "user32" _Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal _lpString As String) As Long

      应当注意,对于VB中使用的系统WindowsAPI函数,应该指定函数的ANSI版本,因为只 WindowsNT才支持Unicode版本,而Windows95不支持这个版本。仅当应用程序只运行 WindowsNT平台上的时候才可以使用Unicode版本。

    ()、使用值或引用传递

      在缺省的情况下,VB以引用方式传递所有参数(ByRef)。这意味着并没有传递实际的参 数值,VB只传递了数据的32位地址。另外有许多DLL过程要求参数以值方式传递(ByVal)。这意味着它们需要实际的数据,而不是数据的内存地址。如果过程需要一个传值参数,而传递给它的参数是一个指针,那么由于得到了错误的数据,该过程将不能正确地工作。要使参数以使用值方式传递,在Declare语句中需要在参数声明的前面加上ByVal关键字。例如InvertRect过程要求第一个参数用传值方式传递,而第二个用引用方式传递:

    Declare Function InvertRect Lib "user32" Alias _

    "InvertRectA" (ByVal hdc As Long, lpRect As RECT) As Long

      动态连接库的参数传递是一个复杂的问题,也是VB中调用动态连接库时最容易出现错误的地方。参数类型或传递方式的声明错误都可能导致应用程序出现GPF(通用保护错误),甚至使操作系统崩溃。



    展开全文
  • 好了,我理解了它。由于kschneid指出,JVM需要应用程序的内存空间中的内存相当大的连续的块。所以我用的Sysinternals的VMMap工具来看看VB的记忆样子。有,事实上,可用内存没有...因为我不使用此加载项,我禁用它。...

    好了,我理解了它。由于kschneid指出,JVM需要应用程序的内存空间中的内存相当大的连续的块。所以我用的Sysinternals的VMMap工具来看看VB的记忆样子。有,事实上,可用内存没有大块,并有属于的Visio一些图书馆中,似乎被设计成产生内存碎片地点被loadeed的。事实证明,当我在新机器上安装了Visio,它会自动安装的Visio UML加载到VB。因为我不使用此加载项,我禁用它。随着加载项禁用,有空闲内存大量连续的大块可用的,而现在的JVM负载就好了。 P>

    我不得不以“克劳斯”和读“http://support.microsoft.com/kb/126962”中描述的同样的问题。改变所提到的文章中描述的注册表。我夸大我的变化:的“%SystemRoot%{escape:md5(28d397e87306b8631f3ed80d858d35f0)} SYSTEM32 \ csrss.exe的ObjectDirectory = \ Windows下的SharedSection = 3072,3072,3072的Windows =在SubSystemType =的Windows ServerDll = basesrv,1 ServerDll = winsrv:UserServerDllInitialization,3 ServerDll = winsrv:ConServerDllInitialization ,2 ProfileControl =关闭MaxRequestThreads = 16“ p>

    要实地考察一下就是“个SharedSection = 3072,3072,3072”。它解决了我的问题,但我可能有副作用,因为这个改变的。 P>

    展开全文
  • 我已经在vb.net工程中app.config中加入了, <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup> 请...
  • VB_DLL_Link

    2006-09-09 22:28:55
    此软件可利用VB制作可输出函数的通用DLL。具体使用方法详见 http://freehost08.websamba.com/hzhzhz/exebyme/VB_Dll.asp。强烈推荐VB爱好者使用
  • VB使用smtp.dll发送Email程序演示,简邮邮件发送组件,mtp.dll通过smtp协议发送邮件,为标准windows dll 支持VB VC等主流编程工具调用,调用方式跟调用windows api完全相同。 使用或者发布后无需注册控件 无需做成...
  • VB使用HOOK.dll禁止程序创建进程
  • 现在要用vb.NET来调用Crystal Report 2008做成一个组件来共VB 6使用(因为CR2008 不再支持VB 6)。可是把.NET 的dll 转成COM dll 不成功,在VB 里面老是无法引用。郁闷呢
  • VB调用DLL资源文件

    2011-11-05 14:52:28
    将项目图片、文字等使用VC++编写资源文件DLL提供给VB调用
  • VB Activex DLL

    2013-06-06 16:20:46
    1.使用OLEView 产生对应.DLL文件的 .IDL文件 为VS2008添加OLE/COM 对象查看器 为VS2008添加OLE/COM 对象查看器 打开vs2008的菜单 依次选择"工具(Tools)"->"外部工具(External Tools)"->"添加"。再点“添加...
  • vb制作可输出函数的通用DLL---VB_DLL_Link用法论坛越来越多人关注dll,特分享一下vb制作可输出函数的通用DLL---VB_DLL_Link用法 大家知道,VB6只能制作ActiveX DLL文件,...使用VB_DLL_Link程序就可以利用VB编译出通
  • VB 调用DLL

    千次阅读 2005-09-07 16:37:00
    在VC++中,如果生成DLL可以不使用.def文件。你只需要在VC++的函数定义前要加__declspec(dllexport)修饰就可以了。但是使用__declspec(dllexport)和使用.def文件是有...但是如果你的DLL是供VB、PB、Delphi用户使用的,
  • vb6可以做标准DLL方法很简单,...解决了VB6不能编译普通DLL的问题,但是用这种方法后,要在项目中产际使用,传递参数,尤其是数组会有很多问题。我后来还是用了ActiveDLL的基本功能,这样Delphi可以自动生成一些代码
  • 我有一个VB6程序。它是编译的(没有可构建的源代码),由一个.EXE和几个.dll组成。在我创建了一个简单的Python脚本来调用库中的一些公共方法。不幸的是,Python中没有可用的方法,或者我没有正确地调用它们。在代码:...
  • VB封装DLL实例讲解

    2010-06-28 13:23:07
    一、 DLL基本概念 (一)概念 DLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是...二、 用VB封装VBA代码,构建自定义的DLL动态链接库
  • <br />vc编写供vb使用dll文档 工具:vc6 工程类型: win32 dynamic_link library 要点:  1 导出函数的参数入栈 _stdcall  2 导出函数的定义 写在 .def文件中  3 参数中如果...
  • VB封装DLL并调用

    千次阅读 2017-09-26 10:46:24
    DLL:动态链接库(Dynamic Link Library),一个DLL文件里面可以包含多个函数,其实就是实现共享函数的一种方式,一个应用程序可能需要多个DLL联合起来才可以正常使用 一,新建ActiveX Dll 工程,然后在里面的类模块...
  • 通过使用类型库提高VB调用DLL函数的性能 (转)[@more@] 本文始发于水木清华BBS(smth.org),转载请保留有关信息,谢谢! 通过使用类型库提高VB调用DLL函数的性能 RoachCock@smthMa...
  • 突破VBDLL编写教程

    2009-04-08 17:41:40
    VB编写DLL的经验教程 开始写 dll 之前,你需要一个 c/c++ 编译器和链接器,并关闭你的 IDE 。是的,把你的 VC 和 C++ BUILDER 之类的 东东都关掉,并打开你以往只用来记电话的记事本程序。不这样做的话,你可能...
  • VB封装DLL实例讲解一 DLL基本概念 一 概念 DLL即动态链接库Dynamic Link Library ,是由可被其它程序调用的函数集合组成的可执行文件模 块DLL不是应用程序的组成部分而是运行时链接到应用程序中 二 主要优点 1多个...
  • VB 6.0 编制的 ActiveX DLL,同样是 win 10 系统,有些电脑上安装使用正常 有些电脑上则能够安装成功(见图片),但是调用 DLL 的时候却提示 【未注册类 ....】 已经使用了管理员身份进行安装及注册了的,,, ...
  • 仅一个Win32 dll (非COM, 可直接使用), 让VB6拥有强大而不复杂的Firebird数据库,包含C++dll源码和VB6 Demo源码演示 firebird是一个全功能的,强大高效的,轻量级,免维护的数据库。它很容易让您从单用户,单数据库...
  • 如何用Vb注册Dll

    2010-11-26 14:27:00
    FileCopy App.Path & "/test.dll", "C:/windows/system32/VbTest.dll" '注册Dll '/u——反注册控件 '/s——不管注册成功与否,均不显示提示框 '/c——控制台输出 '/i——跳过控件的选项进行安装(与注册不同) '...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,181
精华内容 872
关键字:

vb使用dll