请问下面API在C#中怎么声明?
int32 GetDataFromEthernet(unsigned long pDT4000, char *pData, long *lDataLength, unsigned char cBlocked);

解决方案 »

  1.   

    参考这个
    extern WINAPI void YaData(BYTE * pInData,int L,BYTE *pOutData,int &OutSize);
    extern WINAPI void YaData( System.IntPtr pInData,int L, System.IntPtr pOutData, ref int OutSize);
    c# call
    byte[] bInData = .....
    System.IntPtr hIn = Marshal.UnsafeAddrOfPinnedArrayElement( bInData ,0);
    byte[] bOutData = new byte[bInData.Length];
    int outlen = 0;
    System.IntPtr hOut = Marshal.UnsafeAddrOfPinnedArrayElement( bOutData ,0);
    YaData( hIn , hIn.Length , hOut, ref  outlen );
    Marshal.Copy( hout , bOutData , 0 , outlen );
      

  2.   

    Have a try!
    [DllImport(..)]
    public extern static int32 GetDataFromEthernet( uint pDT4000, byte[] pData, ref int lDataLength, byte cBlocked);
      

  3.   

    or
    [DllImport(..)]
    public extern static int32 GetDataFromEthernet( uint pDT4000, [Out]byte[] pData, ref int lDataLength, byte cBlocked);
      

  4.   

    Knight94(愚翁) :
    我是采用第一种的,但pData没有获取数据?晕死了
      

  5.   

    在VB中是这样声明的:
    Public Declare Function GetDataFromEthernet Lib "DT4000_LIB.dll" (ByVal IpAddress As Long, ByVal sData As String, DataLen As Long, ByVal cBlock As Byte) As Long
    我对VB不熟
      

  6.   

    Have a try!
    [DllImport(..)]
    public extern static int32 GetDataFromEthernet( uint pDT4000,
     [Out, MarshalAs(UnmanagedType.LPTStr)]string pData, ref int lDataLength, byte cBlocked);or[DllImport(..)]
    public extern static int32 GetDataFromEthernet( uint pDT4000,
     [Out, MarshalAs(UnmanagedType.LPTStr)]StringBuilder pData, ref int lDataLength, byte cBlocked);
      

  7.   

    谢谢Knight94(愚翁) :
    但问题还是一样的
    pData返回空字符串,lDataLength = 0
      

  8.   

    string sData = "";
    int dataLen = 0;
    int ret = GetDataFromEthernet(_ipAddress,sData,ref dataLen,0);
      

  9.   

    [DllImport(..)]
    public extern static int32 GetDataFromEthernet( uint pDT4000,
    [Out, MarshalAs(UnmanagedType.LPTStr)]StringBuilder pData, ref int lDataLength, byte cBlocked);//Call
    StringBuilder sData = new StringBuilder( 256 );
    int dataLen = 0;
    int ret = GetDataFromEthernet(_ipAddress,sData,ref dataLen,0);
      

  10.   

    Bits Win32 Type Managed Type(C#) Typical Value
    32 DWORD Int32 IOCTL_HAL_GET_DEVICEID
    32 LPVOID IntPtr IntPtr.Zero (no input data required)
    32 DEVICE_ID* byte[] byte[20] (20 bytes is the size of the DEVICE_ID structure)
    32 LPDWORD ref Int32 0
    32 WORD ushort 说明:在win32中以LP开头的,表示是Long Point(常指针),在C#中一般是以相对应的ref类型的参数。
    参考一下上面的,会对你有所帮助的。