如何将C++类型转换成C#对应类型以实现dll函数调用

worrydog 2010-03-04 11:02:53
有一个C++类型结构不知道如何在c#中调用,那位大侠给个解释,谢谢。

C++结构类型
typedef struct tagMinutiae {
int x; // 横坐标
int y; // 纵坐标
int Direction; // 方向
int Triangle[3];
int Type; // 类型
} MINUTIA, *MINUTIAPTR;

typedef struct tagFeature{
int MinutiaNum;
MINUTIA MinutiaArr[MAX_MINUTIANUM];
} FEATURE, *FEATUREPTR;

调用的dll入口函数
int GetMinutia(BYTE *lpData, BYTE *lpOrient, LPVOID feature, int IMGW, int IMGH);
...全文
789 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
spade24 2010-03-04
  • 打赏
  • 举报
回复
qqiuzaihui 2010-03-04
  • 打赏
  • 举报
回复
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 位
zhouxingyu896 2010-03-04
  • 打赏
  • 举报
回复
若在msdn中有的函数,上面的方法应该可以的
若是自己的写的函数,要加上#define LIBEXPORT_API extern "C" __declspec(dllexport),将其函数引出
再用上面的形式进行调用。
其实,本网站有这方面的资料下载。
hapen_zhang 2010-03-04
  • 打赏
  • 举报
回复

[StructLayout(LayoutKind.Sequential)]
struct tagMinutiae
{
[MarshalAs(UnmanagedType.I2)]
public short x; // 横坐标
[MarshalAs(UnmanagedType.I2)]
public short y; // 纵坐标
[MarshalAs(UnmanagedType.I2)]
public short Direction; // 方向
[MarshalAs(UnmanagedType.SafeArray, SizeConst = 3)]
public short[] Triangle;
[MarshalAs(UnmanagedType.I2)]
public short Type; // 类型
}
[StructLayout(LayoutKind.Sequential)]
struct tagFeature
{
[MarshalAs(UnmanagedType.I2)]
public short MinutiaNum;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_MINUTIANUM, ArraySubType = UnmanagedType.Struct)]
public tagMinutiae[] MinutiaArr;
}

[DllImport(" ")]
public static extern short GetMinutia(ref byte[] lpData, ref byte[] lpOrient, IntPtr feature, short IMGW, short IMGH);

110,550

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧