我写的是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声明吗?
#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声明吗?
public init dcc_init(..)
{
...
}
[DllImport(“CppDll.dll")]
public int dcc_init(..) ;[DllImport(“CppDll.dll")]
public int dcc_msg_send(int dcc_hdl,struct dc_msg msg);
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
楼主好强!顶下
此类define没必要管吧
再说dllimport大多只关心你的接口,至于你内部define什么,和它没关系
#define MODE_UDP 0
这些不就是const常量定义吗?再说,c/c++规范也建议用常量,而不是宏定义
顶
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")]
<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楼
转帖一篇, 给你参考一下: 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 位