请问C#调用C++编写的DLL时,函数SI_Write (HANDLE Handle, LPVOID Buffer, DWORD NumBytesToWrite,DWORD *NumBytesWritten)应该怎样调用啊?我这样:[DllImport("SiUSBXp.dll", SetLastError = true, EntryPoint = "SI_Write", CharSet = CharSet.Ansi)]
        public static extern int SI_Write(ref  IntPtr hPrinter,ref byte[] pBuf, UInt32 cdBuf, ref  UInt32 pcWritten);是不是不对的?

解决方案 »

  1.   

    public static extern int SI_Write(IntPtr hPrinter,byte[] pBuf, int cdBuf, ref  int pcWritten);
      

  2.   

    LPVOID 不是一个指针吗?相当于void*,怎么能用byte[] pBuf呢?
      

  3.   

    LPVOID ->IntPtr
    你可能还需要Marshal的相关方法得到这个值
      

  4.   

    Marshal是申请非托管的内存吧?我不大懂什么时候用托管内存,什么时候用非托管内存。
    我声明的ref byte[] pBuf其实不就是数组的地址吗?这样不可以吗?
    我现在是声明为SI_Write(IntPtr hPrinter,ref byte[] pBuf, UInt32 cdBuf, out UInt32 pcWritten);还是不行。
    请帮帮忙啊,到底应该怎样声明呢?
      

  5.   

    Marshal是申请非托管的内存吧?我不大懂什么时候用托管内存,什么时候用非托管内存。
    我声明的ref byte[] pBuf其实不就是数组的地址吗?这样不可以吗?
    我现在是声明为SI_Write(IntPtr hPrinter,ref byte[] pBuf, UInt32 cdBuf, out UInt32 pcWritten);还是不行。
    请帮帮忙啊,到底应该怎样声明呢?
      

  6.   

    Marshal是申请非托管的内存吧?我不大懂什么时候用托管内存,什么时候用非托管内存。
    我声明的ref byte[] pBuf其实不就是数组的地址吗?这样不可以吗?
    我现在是声明为SI_Write(IntPtr hPrinter,ref byte[] pBuf, UInt32 cdBuf, out UInt32 pcWritten);还是不行。
    请帮帮忙啊,到底应该怎样声明呢?
      

  7.   

    [DllImport("SiUSBXp.dll", SetLastError = true, EntryPoint = "SI_Write", CharSet = CharSet.Ansi)]
    EntryPoint 不是用别名的时候才有必要设置的吗?