各位大虾:
   求救!
   我要用C#调用一个硬件的dll来控制硬件工作,因参数中有大量各式指针,从而很苦恼,部分函数如下:
1.int OpenUSB_Board(int deviceIndex,void *handle)2.Int SetInteractInfo(InteractData* interactInfo);地区//InteractData为一结构体3.int ReadUSB_BoardSN(char *boardSN)4.bool GetExternalStartStopSignal(int &start, int &stop)5.int InputCommand(unsigned char port)望大虾 帮忙。项目在即。最好能给个小例子,在C#中怎么引用、怎么转换、参数怎么传,怎么接受返回值,说明越详细越佳。谢谢...

解决方案 »

  1.   

    [DllImport("×××.dll")]
            private static extern int OpenUSB_Board(
                int lpszProductID,
                ref void lpszRCode
                );类似这样吧char* 用ref string
      

  2.   

    C#中调用Windows API时的数据类型对应关系
       
    BOOL=System.Int32 BOOLEAN=System.Int32 BYTE=System.UInt16
    CHAR=System.Int16 COLORREF=System.UInt32 DWORD=System.UInt32
    DWORD32=System.UInt32 DWORD64=System.UInt64 FLOAT=System.Float
    HACCEL=System.IntPtr HANDLE=System.IntPtr HBITMAP=System.IntPtr
    HBRUSH=System.IntPtr HCONV=System.IntPtr HCONVLIST=System.IntPtr
    HCURSOR=System.IntPtr HDC=System.IntPtr HDDEDATA=System.IntPtr
    HDESK=System.IntPtr HDROP=System.IntPtr HDWP=System.IntPtr
    HENHMETAFILE=System.IntPtr HFILE=System.IntPtr HFONT=System.IntPtr
    HGDIOBJ=System.IntPtr HGLOBAL=System.IntPtr HHOOK=System.IntPtr
    HICON=System.IntPtr HIMAGELIST=System.IntPtr HIMC=System.IntPtr
    HINSTANCE=System.IntPtr HKEY=System.IntPtr HLOCAL=System.IntPtr
    HMENU=System.IntPtr HMETAFILE=System.IntPtr HMODULE=System.IntPtr
    HMONITOR=System.IntPtr HPALETTE=System.IntPtr HPEN=System.IntPtr
    HRGN=System.IntPtr HRSRC=System.IntPtr HSZ=System.IntPtr
    HWINSTA=System.IntPtr HWND=System.IntPtr INT=System.Int32
    INT32=System.Int32 INT64=System.Int64 LONG=System.Int32
    LONG32=System.Int32 LONG64=System.Int64 LONGLONG=System.Int64
    LPARAM=System.IntPtr LPBOOL=System.Int16[] LPBYTE=System.UInt16[]
    LPCOLORREF=System.UInt32[] LPCSTR=System.String LPCTSTR=System.String
    LPCVOID=System.UInt32 LPCWSTR=System.String LPDWORD=System.UInt32[]
    LPHANDLE=System.UInt32 LPINT=System.Int32[] LPLONG=System.Int32[]
    LPSTR=System.String LPTSTR=System.String LPVOID=System.UInt32
    LPWORD=System.Int32[] LPWSTR=System.String LRESULT=System.IntPtr
    PBOOL=System.Int16[] PBOOLEAN=System.Int16[] PBYTE=System.UInt16[]
    PCHAR=System.Char[] PCSTR=System.String PCTSTR=System.String
    PCWCH=System.UInt32 PCWSTR=System.UInt32 PDWORD=System.Int32[]
    PFLOAT=System.Float[] PHANDLE=System.UInt32 PHKEY=System.UInt32
    PINT=System.Int32[] ID=System.UInt32 PLONG=System.Int32[]
    PLUID=System.UInt32 PSHORT=System.Int16[] PSTR=System.String
    PTBYTE=System.Char[] PTCHAR=System.Char[] PTSTR=System.String
    PUCHAR=System.Char[] PUINT=System.UInt32[] PULONG=System.UInt32[]
    PUSHORT=System.UInt16[] PVOID=System.UInt32 PWCHAR=System.Char[]
    PWORD=System.Int16[] PWSTR=System.String REGSAM=System.UInt32
    SC_HANDLE=System.IntPtr SC_LOCK=System.IntPtr SHORT=System.Int16
    SIZE_T=System.UInt32 SSIZE_=System.UInt32 TBYTE=System.Char
    TCHAR=System.Char UCHAR=System.Byte UINT=System.UInt32
    UINT32=System.UInt32 UINT64=System.UInt64 ULONG=System.UInt32
    ULONG32=System.UInt32 ULONG64=System.UInt64 ULONGLONG=System.UInt64
    USHORT=System.UInt16 WORD=System.UInt16 WPARAM=System.IntPtr
    <---------补充----------->
    Wtypes.h 中的非托管类型     非托管C 语言类型     托管类名        说明 
    HANDLE                  void*             System.IntPtr   32 位 
    BYTE                     unsigned char       System.Byte     8 位 
    SHORT                     short              System.Int16    16 位 
    WORD                      unsigned short      System.UInt16   16 位 
    INT                      int                 System.Int32    32 位 
    UINT                     unsigned int       System.UInt32   32 位 
    LONG                     long              System.Int32    32 位 
    BOOL                      long              System.Int32    32 位 
    DWORD                    unsigned long       System.UInt32   32 位 
    ULONG                     unsigned long    System.UInt32   32 位 
    CHAR                       char              System.Char     用 ANSI 修饰。 
    LPSTR                      char*               System.String 或 System.StringBuilder  用 ANSI 修饰。 
    LPCSTR                     Const char*         System.String 或 System.StringBuilder  用 ANSI 修饰。 
    LPWSTR                     wchar_t*            System.String 或 System.StringBuilder  用 Unicode 修饰。 
    LPCWSTR                  Const wchar_t*     System.String 或 System.StringBuilder  用 Unicode 修饰。 
    FLOAT                      Float             System.Single  32 位 
    DOUBLE                    Double            System.Double  64 位
      

  3.   

    第一个不会。[DllImport("yourdll.dll")]
    InteractData data = new InteractData();
    public static extern int SetInteractInfo(ref data);public static extern int ReadUSB_BoardSN(char[] boardSN);public static extern bool GetExternalStartStopSignal(int start,int stop);public static extern bool InputCommand(String port) //自己理解这个方法应该是设置设备串口的。
      

  4.   

    正在解决谢谢关心 正在参照  qqiuzaihui 给的表进行参数修改
      

  5.   


    [DllImport("yourdll.dll")]
    InteractData data = new InteractData();
    public static extern int SetInteractInfo(ref data);这句报错Error 1 Identifier expected
      

  6.   

    楼主,如果你的C++的dll中指针和参数结构复杂的话,建议你自己使用ATL包装一下C++的dll,然后你的C#程序再调用你包装好的ATL的dll。如果不复杂的话,使用一楼的方法没有问题。
      

  7.   

    现在大部分已经被替换了,按照qqiuzaihui给的表,还有二个是结构体指针,不知替换。 
      

  8.   

    ATL包装 如何用,本人刚学习C#不是很熟请详细指教谢谢...
      

  9.   

    把结构体转成BYTE数组然后加ref试试
      

  10.   

    [DllImport("yourdll.dll")]
    InteractData data = new InteractData();
    public static extern int SetInteractInfo(ref data);这肯定会出错了
    [DllImport("yourdll.dll")]
    public static extern int SetInteractInfo(ref data);
    这两句必须在一起。。
      

  11.   


    [DllImport("yourdll.dll")]
    InteractData data = new InteractData();
    public static extern int SetInteractInfo(ref data);这肯定会出错了
    [DllImport("yourdll.dll")]
    public static extern int SetInteractInfo(ref data);
    这两句必须在一起。。亦是正解。
    这句还有一个错,  格式:ref 类型 data
    这样就可以了