有个c编写的dll,定义如下:
DWORD TEST(
   IN OUT BYTE*  A,
   IN OUT DWORD* B
);
比如dll的名称为X.dll我在vb中定义为
Private Declare Function TEST Lib "C:\WINDOWS\system32\X.dll" (ByVal a As Byte, ByVal b As Integer) As Long
Private Sub Command1_Click()
  Dim tmpA As Byte
  Dim tmpB As Integer
  Dim tmpResult As Long
  tmpResult = XC_GetDevState(tmpA, tmpB)
End Sub但是总是报错“ Unhandled   exception   in   ***.exe:   0xC0000005:   Access   Violation   ”
为什么呢?应该怎么调用呢,急!!!!!!

解决方案 »

  1.   

    Private Declare Function TEST Lib "C:\WINDOWS\system32\X.dll" (ByVal a As Byte, ByVal b As Integer) As Long 
    改为
    Private Declare Function TEST Lib "C:\WINDOWS\system32\X.dll" (ByRef a As Byte, ByRef b As Integer) As Long 
      

  2.   

    改好后报错“DLL 调用约定错误”
      

  3.   

    Private Declare Function TEST Lib "C:\WINDOWS\system32\X.dll" (ByVal a As Byte, ByVal b As Integer) As Long  
    改为 
    Private Declare Function TEST Lib "C:\WINDOWS\system32\X.dll" (ByVal a As long, ByVal b As long) As Long  
      

  4.   

    C写的DLL还需要使用__stdcall方式调用。
      

  5.   

    Cdecl 规约的函数 VB 调用很麻烦的。建立一个模块:
     
    Imports System
    Imports Microsoft.VisualBasic
    Imports System.Runtime.InteropServices
    Public Class LibWrap
    ' Visual Basic does not support varargs, so all arguments must be 
    ' explicitly defined. CallingConvention.Cdecl must be used since the stack 
    ' is cleaned up by the caller. 
    ' int printf( const char *format [, argument]... )
    <DllImport("X.dll", CallingConvention := CallingConvention.Cdecl)> _
    Overloads Shared Function TEST ( _
        a As Byte, b As Long) As Long
    End Function
    End Class 'LibWrap
    Public Class App
        Public Shared Sub Main()
            Dim a As Byte, B As Long
            LibWrap.TEST(a, b)
        End Sub 'Main
    End Class 'App