我写的是winform程序,需要调用一个dll,名为dcc.dll,他是一个不可以直接引用的,所以想用DllImport的方法来使用,可是不知怎么处理,该dll的头文件如下:#ifndef _DCC_H_
#define _DCC_H_#ifdef __cplusplus
extern "C" {
#endif#ifdef WIN32
#define DCCCALL WINAPI
#else
#define DCCCALL 
#endif#define MODE_BLOCK 0
#define MODE_NONBLOCK 1#define MODE_UDP 0
#define MODE_TCP 1
#define IMEI_LEN 15
#define DTU_NAME 15
#define DCC_ID_LEN 3
#define MAX_MSG_LEN 1492
#define USER_NAME_LEN 16
#define PASSWD_MD5_LEN 16#define DC_MSG_DATA 0x00
#define DC_MSG_ONLINE 0x01
#define DC_MSG_OFFLINE 0x02
#define DC_MSG_GETSTATUS 0x03
#define DC_MSG_SENDRESULT 0x04
#define DC_MSG_STATUSRESULT 0x05
#define DC_MSG_LISTEN_DTU 0x06
#define DC_MSG_DCC_ID 0x07
#define DC_MSG_DISC_DTU 0x08
#define DC_MSG_ADD_DTU 0x09
#define DC_MSG_AT_CMD 0x0A
#define DC_MSG_AT_DATA 0x0B
#define DC_MSG_ATDATA_RES 0x0C
#define DC_MSG_NEED_AUTH 0x0D
#define DC_MSG_RENAME_DTU 0x0E
#define DC_MSG_DEL_DTU 0x0F#define DC_MSG_AUTH 0x50
#define DC_MSG_AUTH_RESULT 0x51
#define DC_MSG_VIDEO_START 0x52
#define DC_MSG_VIDEO_STOP 0x53
#define DC_MSG_VIDEO_GET 0x54
#define DC_MSG_VIDEO_ATTRIBUTES 0x55
#define DC_MSG_VIDEO_SET 0x56#define SENDRESULT_SUCCESS 0x00
#define SENDRESULT_NOSUCHDTU 0x01
#define SENDRESULT_OFFLINE 0x02
#define SENDRESULT_CONGESTED  0x03
#define SENDRESULT_NORIGHT  0x04#define STATUSRESULT_NOSUCHDTU 0x00
#define STATUSRESULT_ONLINE 0x01
#define STATUSRESULT_OFFLINE 0x02
#define STATUSRESULT_NORIGHT 0x03#define AUTHRESULT_PASSED 0x00
#define AUTHRESULT_FAILED 0x01struct dc_msg {
char imei[IMEI_LEN+1];
char name[DTU_NAME+1];
unsigned char msg_type; /* DC_MSG_DATA, DC_MSG_ONLINE, DC_MSG_OFFLINE */
unsigned char reserved;
unsigned short msg_len;
unsigned char msg_body[MAX_MSG_LEN];
};int DCCCALL dcc_init(
int mode, 
unsigned short port, 
const char *dc_ip, 
unsigned short dc_port, 
int block);
int DCCCALL dcc_close(int dcc_hdl);
int DCCCALL dcc_msg_send(int dcc_hdl, struct dc_msg *msg);
int DCCCALL dcc_msg_receive(int dcc_hdl, struct dc_msg *msg);
int DCCCALL dcc_msg_send_auth(int dcc_hdl, char *user, char *passwd);
int DCCCALL dcc_get_local_ip(int dcc_hdl);
#ifdef __cplusplus
}
#endif#endif我想调用这几个函数,谁能帮我转化为C#的DllImport声明吗?

解决方案 »

  1.   

    [DllImport(“CppDll.dll")]
    public init dcc_init(..)
    {
    ...
    }
      

  2.   

    不好意思:
    [DllImport(“CppDll.dll")]
    public int dcc_init(..) ;[DllImport(“CppDll.dll")]
    public int dcc_msg_send(int dcc_hdl,struct dc_msg msg);
      

  3.   

    谢谢,不过我知道大概是这样写,就是不知道比如#define 等在C#中转化为什么,还有那些数据类型,不知转化为什么
      

  4.   

    int DCCCALL dcc_close(int dcc_hdl);
    int DCCCALL dcc_msg_send(int dcc_hdl, struct dc_msg *msg);
    int DCCCALL dcc_msg_receive(int dcc_hdl, struct dc_msg *msg);
    int DCCCALL dcc_msg_send_auth(int dcc_hdl, char *user, char *passwd);
    int DCCCALL dcc_get_local_ip(int dcc_hdl);
    #ifdef __cplusplus
    楼主好强!顶下
      

  5.   

    #define _DCC_H_
    此类define没必要管吧
    再说dllimport大多只关心你的接口,至于你内部define什么,和它没关系
    #define MODE_UDP    0
    这些不就是const常量定义吗?再说,c/c++规范也建议用常量,而不是宏定义
      

  6.   

    [DllImport(“CppDll.dll")] 
      

  7.   


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
    namespace csdnTest
    {
        
        class DCCCALL
        {
            public struct dc_msg {
                char []imei;
                char []name;
                byte msg_type;        /* DC_MSG_DATA, DC_MSG_ONLINE, DC_MSG_OFFLINE */
                byte reserved;
                UInt16 msg_len;        
                byte[] msg_body;
            };
            [DllImport("dcc.dll")]
            public static extern int  dcc_init(
                                int mode, 
                                byte port, 
                                string dc_ip, 
                                UInt16 dc_port, 
                                int block);
            [DllImport("dcc.dll")]
            public static extern int dcc_close(int dcc_hdl);
            [DllImport("dcc.dll")]
            public static extern int dcc_msg_send(int dcc_hdl, ref dc_msg msg);
            [DllImport("dcc.dll")]
            public static extern int dcc_msg_receive(int dcc_hdl, ref dc_msg msg);
            [DllImport("dcc.dll")]
            public static extern int dcc_msg_send_auth(int dcc_hdl, string user, string passwd);
            [DllImport("dcc.dll")]
            public static extern int dcc_get_local_ip(int dcc_hdl);    }
    }
    若无法加载请在[DllImport("dcc.dll")]中加入路径,如[DllImport(@"C:\dcc.dll")]
      

  8.   


    <code>
     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
            public struct dc_msg
            {
                [MarshalAs(16)]
                string imei;
                [MarshalAs(16)]
                string name;
                byte msg_type;        /* DC_MSG_DATA, DC_MSG_ONLINE, DC_MSG_OFFLINE */
                byte reserved;
                UInt16 msg_len;
                [MarshalAs(1492)]
                string msg_body;
            };
    //还有dllimport时最好也制定对应的CharSet
    [DllImport("dcc.dll", CharSet = CharSet.Ansi)]
    </code>其他见10楼
      

  9.   


    转帖一篇, 给你参考一下:  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 位