最近做一个私人项目,一个模块用到了较多的api。觉得c#中(我原来是做delphi的),使用api函数较为不便,就萌生了
把api函数集全部封装,做成一个程序集,这样c#程序中只要引用此DLL,就可以直接使用某api函数(程序集win32api.dll 含1500多api,6000多常量声明,400多个api调用使用的结构体声明)
做了如下尝试:
1、参考了一些网站
但是,发现他声明的函数参数也有些处理的不好,而且结构体声明,居然只有一个页面有(好像是kernel32.dll),其他dll
参数使用的结构体居然未写上,于是放弃里从该网站获取函数声明的念头。
2、直接使用vb6的win32api.txt,发现他的函数声明字符一律是string,见下例:
vb6声明:
Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
通过自动转换,生成的c#声明为:
[DllImport("user32.dll", EntryPoint = "GetClassName")]
public static extern int GetClassName(IntPtr hwnd,string lpString, int cch);
使用时发现根本取不到第二个参数的返回值。所以从vb6转换的希望也破灭。
3、现在决定从delphi的windows.pas单元转换。
delphi声明:
function GetClassName(hWnd: HWND; lpClassName: PChar; nMaxCount: Integer): Integer; stdcall;
这样声明的话,很清楚的第二个参数不能传常量string了,传字符地址是可以的。
现在遇到如下问题:
windows.pas单元中封装api时使用了很多delphi自己的类型,现在要和c#的数据类型做一个转换,类型我已经全部提取出来了。
其中左边是delphi的类型,右边是我转换的类型(含??字样的说明还不确定,带“结构体”字样的,那是确定了的,因为我在已经定义好的400多个结构体中能找到匹配项),请热心的朋友帮忙看看,这样转换是否有问题,
如果你认为有问题,请把你认为正确的转换关系发出来。大家来讨论讨论。
按照我下面定义好的类型转换关系,我用工具转换SendMessage函数的结果是:
[DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(int hWnd, int Msg, int wParam, int lParam);
//Integer - int
//Pointer - IntPtr
//PLongint - IntPtr
//Longint - long
//HGLOBAL - int
//HMODULE - int
//DWORD - long
//LPCSTR - IntPtr,StringBuffer
//UINT - uint
//TMemoryStatus - MEMORYSTATUS (结构体)
//HLOCAL - int
//THandle - long
//TMemoryBasicInformation - MEMORY_BASIC_INFORMATION (结构体)
//TProcessHeapEntry - ???
//PChar - IntPtr,StringBuffer
//PAnsiChar - IntPtr,StringBuffer
//PWideChar - IntPtr,StringBuffer
//TFileTime - FILETIME (结构体)
//BOOL - bool
//PDWORD - IntPtr
//TExceptionPointers - EXCEPTION_POINTERS
//TFNFiberStartRoutine - IntPtr
//TFNTopLevelExceptionFilter - IntPtr
//TFNThreadStartRoutine - IntPtr
//Bool - bool
//TLDTEntry - LDT_ENTRY(结构体);
//TOverlapped - OVERLAPPED (结构体);
//POverlapped - IntPtr, ref OVERLAPPED ???
//TContext - CONTEXT (结构体);
//TFNAPCProc - IntPtr
//TDebugEvent - ???
//TRTLCriticalSection - ???
//PWOHandleArray - IntPtr
//HINST - int
//HRSRC - int
//ATOM - int
//TByHandleFileInformation - BY_HANDLE_FILE_INFORMATION (结构体);
//PFileTime - IntPtr,ref FILETIME(结构体) ??
//PHandle - IntPtr
//PComStat - IntPtr
//TCommConfig - COMMCONFIG(结构体);
//TCommProp - COMMPROP (结构体);
//TDCB - DCB (结构体);
//TCommTimeouts - COMMTIMEOUTS (结构体);
//CHAR - char
//TSystemTime - SYSTEMTIME (结构体);
//TSystemInfo - SYSTEM_INFO (结构体);
//PTimeZoneInformation - intptr,ref TIME_ZONE_INFORMATION(结构体)
//TTimeZoneInformation -TIME_ZONE_INFORMATION(结构体)
//Word - int
//PSecurityAttributes - intptr,ref SECURITY_ATTRIBUTES(结构体)
//ULONG - ulong
//TFNExportFunc - ???
//TFNImportFunc - ???
//TRecoveryAgentInformation - ???
//TRecoveryAgentInformationA - ???
//TRecoveryAgentInformationW - ???
//TOFStruct - OFSTRUCT(结构体)
//HFILE - long
//PINT - intPtr
//TPROverlappedCompletionRoutine - intPtr
//FARPROC - intPtr
//PByte - intPtr
//TLargeInteger - LARGE_INTEGER(结构体)
//TFNTimerAPCRoutine - intPtr
//TStartupInfo - STARTUPINFO (结构体)
//TProcessInformation - PROCESS_INFORMATION(结构体)
//ENUMRESTYPEPROC - intPtr
//ENUMRESNAMEPROC - intPtr
//ENUMRESLANGPROC - intPtr
//PLargeInteger - intPtr
//TGetFileExInfoLevels - ???
//TFindexInfoLevels - ???
//TFindexSearchOps - ???
//TWIN32FindData - WIN32_FIND_DATA (结构体)
//TWIN32FindDataA - WIN32_FIND_DATA (结构体)
//TWIN32FindDataW - WIN32_FIND_DATA (结构体)
//TFNProgressRoutine - intPtr
//PBool - intPtr
//TSecurityImpersonationLevel - ???
//SECURITY_INFORMATION - long
//PSecurityDescriptor - intptr,ref SECURITY_DESCRIPTOR (结构体)
//TGenericMapping - GENERIC_MAPPING (结构体)
//TPrivilegeSet - PRIVILEGE_SET (结构体)
//PSID - intPtr
//PObjectTypeList - intPtr
//TTokenInformationClass - ??
//TTokenPrivileges - TOKEN_PRIVILEGES (结构体)
//PTokenPrivileges - intPtr
//TTokenGroups - TOKEN_GROUPS (结构体)
//AUDIT_EVENT_TYPE
//UCHAR - byte
//TSIDIdentifierAuthority - ??
//Byte - byte
//TACL - ACL (结构体)
//TAclInformationClass - ??
//PGuid - intPtr
//SECURITY_DESCRIPTOR_CONTROL - long
//PACL - intPtr
//PGUID - intPtr
//LPDWORD - intPtr
//SID_NAME_USE - long
//HWND - int
//PCommConfig - intPtr
//TTokenType - ??
//THWProfileInfo - ??
//THWProfileInfoA - ??
//THWProfileInfoW - ??
//TOSVersionInfo - OSVERSIONINFO (结构体)
//TSystemPowerStatus - SYSTEM_POWER_STATUS (结构体)
//TWinCertificate - ??
//TGUID - ??
//HPALETTE - long
//PPaletteEntry - intPtr
//HDC - long
//PPixelFormatDescriptor - intPtr
//HRGN - long
//HMETAFILE - int
//TBitmap - ??
//TLogBrush - LOGBRUSH (结构体)
//PDeviceMode - intPtr
//PDeviceModeA - intPtr
//PDeviceModeW - intPtr
//TBitmapInfoHeader - BITMAPINFOHEADER (结构体)
//TBitmapInfo - BITMAPINFO (结构体)
//TRect - RECT (结构体)
//TLogFont -LOGFONT (结构体)
//TLogFontA -LOGFONT (结构体)
//TLogFontW -LOGFONT (结构体)
//COLORREF - long
//TLogPalette - LOGPALETTE (结构体)
//TLogPen - LOGPEN (结构体)
//HBITMAP - long
//HGDIOBJ - long
//TPixelFormatDescriptor - PIXELFORMATDESCRIPTOR (结构体)
//TFNFontEnumProc - intPtr
//LPARAM - long
//TFNFontEnumProcA - intPtr
//TFNFontEnumProcW - intPtr
//TFNGObjEnumProc - intPtr
//LPSTR -intPtr,Ref stringbuffer
//PXForm - intPtr
//TRgnData - RGNDATA (结构体)
//HBRUSH - long
//TSize - SIZE (结构体)
//TPoint - POINTAPI (结构体)
//PPoint - intPtr
//HBitmap - long
//TGlyphMetrics - GLYPHMETRICS (结构体)
//TMat2 - MAT2 (结构体)
//TRasterizerStatus - RASTERIZER_STATUS(结构体)
//PRgnData - intPtr
//PInteger - intPtr
//PFontSignature - intPtr
//TCharsetInfo - CHARSETINFO (结构体)
//TGCPResults - GCP_RESULTS (结构体)
//PGlyphSet - intPtr
//PWORD - intPtr
//PDesignVector - intPtr
//PEnumLogFontExDV - intPtr
//PEnumLogFontExDVA - intPtr
//PEnumLogFontExDVW - intPtr
//TFNLineDDAProc - intPtr
//TDeviceMode - ??
//TDeviceModeA - ??
//TDeviceModeW - ??
//PRect - intPtr
//HRgn - long
//TBlendFunction - intPtr
//PBitmapInfo - ??
//TTriVertex - ??
//THandleTable - HANDLETABLE (结构体)
//TMetaRecord - METARECORD (结构体)
//TFNMFEnumProc - intPtr
//HENHMETAFILE - int
//TFNEnhMFEnumProc - intPtr
//PEnhMetaHeader - intPtr
//Cardinal - int
//TEnhMetaRecord - ENHMETARECORD (结构体)
//TMetaFilePict - METAFILEPICT (结构体)
//TTextMetric - TEXTMETRIC (结构体)
//TTextMetricA - TEXTMETRIC (结构体)
//TTextMetricW - TEXTMETRIC (结构体)
//Single - int
//TXForm - XFORM (结构体)
//TColorAdjustment - COLORADJUSTMENT (结构体)
//TDocInfo - DOCINFO (结构体)
//TDocInfoA - DOCINFO (结构体)
//TDocInfoW - DOCINFO (结构体)
//TFNAbortProc - intPtr
//PSingle - intPtr
//PSize - intPtr
//HCOLORSPACE - long
//TLogColorSpace - LOGCOLORSPACE (结构体)
//TLogColorSpaceA - LOGCOLORSPACE (结构体)
//TLogColorSpaceW - LOGCOLORSPACE (结构体)
//TFNICMEnumProc - intPtr
//HGLRC - long
//PGlyphMetricsFloat - intPtr
//TLayerPlaneDescriptor - ??
//PWGLSwap - intPtr
//va_list - intPtr
//HKL - long
//TMouseMovePoint - ??
//HWINSTA - long
//TFNDeskTopEnumProc - intPtr
//HDESK - long
//TFNWndEnumProc - intPtr
//TFNWinStaEnumProc - intPtr
//TTrackMouseEvent - ??
//TMsg - MSG (结构体)
//WPARAM - int
//TFNSendAsyncProc - intPtr
//HDEVNOTIFY - intPtr
//LRESULT - int
//TFNWndProc - intPtr
//TWndClass - WNDCLASS (结构体)
//TWndClassA - WNDCLASS (结构体)
//TWndClassW - WNDCLASS (结构体)
//TWndClassEx - WNDCLASS (结构体)
//TWndClassExA - WNDCLASS (结构体)
//TWndClassExW - WNDCLASS (结构体)
//HMENU - long
//PBLENDFUNCTION - intPtr
//FLASHWINFO - ??
//PWindowPlacement FLASHWINFO
//HDWP - int
//TFNDlgProc - intPtr
//TDlgTemplate - DLGTEMPLATE (结构体)
//Char char
//AnsiChar char
//WideChar char
//TKeyboardState // ?
//TInput // ?
//TLastInputInfo // ?
//TFNTimerProc - intPtr
//HACCEL - long
//PTPMParams - intPtr
//TMenuInfo - MENUITEMINFO (结构体)
//TMenuItemInfo - MENUITEMINFO (结构体)
//TMenuItemInfoA - MENUITEMINFO (结构体)
//TMenuItemInfoW - MENUITEMINFO (结构体)
//HICON - long
//PDrawTextParams - intPtr
//TFNGrayStringProc - intPtr
//TFNDrawStateProc - intPtr
//TPaintStruct - PAINTSTRUCT (结构体)
//TFNPropEnumProcEx - intPtr
//TFNPropEnumProc - intPtr
//TMsgBoxParams - MSGBOXPARAMS (结构体)
//TMsgBoxParamsA - MSGBOXPARAMS (结构体)
//TMsgBoxParamsW - MSGBOXPARAMS (结构体)
//Pointer - intPtr
//TFNHookProc - intPtr
//HHOOK - long
//TIconInfo - ICONINFO (结构体)
//TScrollInfo - SCROLLINFO (结构体)
//TDisplayDevice // ?
//TDisplayDeviceA // ?
//TDisplayDeviceW // ?
//TFNWinEventProc - intPtr
//TGUIThreadinfo // ?
//TCursorInfo CURSORINFO
//TWindowInfo // ?
//TTitleBarInfo // ?
//TMenuBarInfo // ?
//TScrollBarInfo // ?
//TComboBoxInfo // ?
//TAltTabInfo // ?
//TCPInfo - CPINFO (结构体)
//LPWSTR - intPtr
//PBOOL - intPtr
//LCID - long
//LCTYPE - long
//PSystemTime - intPtr
//PNumberFmt - intPtr
//PNumberFmtA - intPtr
//PNumberFmtW - intPtr
//PCurrencyFmt - intPtr
//PCurrencyFmtA - intPtr
//PCurrencyFmtW - intPtr
//TFNCalInfoEnumProc - intPtr
//CALID - long
//CALTYPE - long
//TFNTimeFmtEnumProc - intPtr
//TFNDateFmtEnumProc - intPtr
//WCHAR - char
//TFNLocaleEnumProc - intPtr
//TFNCodepageEnumProc - intPtr
//TInputRecord // ?
//TCoord - COORD (结构体)
//TSmallRect - SMALL_RECT (结构体)
//TConsoleScreenBufferInfo - CONSOLE_SCREEN_BUFFER_INFO
//TConsoleCursorInfo - CONSOLE_CURSOR_INFO (结构体)
//PSmallRect - intPtr
//TCharInfo - CHAR_INFO
//TFNHandlerRoutine - intPtr
//HKEY - long
//REGSAM - long
//PSECURITY_DESCRIPTOR - intPtr
//TNetResource - NETRESOURCE (结构体)
//TNetResourceA - NETRESOURCE (结构体)
//TNetResourceW - NETRESOURCE (结构体)
//TConnectDlgStruct // ?
//TDiscDlgStruct // ?
//TDiscDlgStructA // ?
//TDiscDlgStructW // ?
//PNetResource - intPtr
//PNetResourceA - intPtr
//PNetResourceW - intPtr
//TNetInfoStruct // ?
//PNetConnectInfoStruct - intPtr
//HWnd - long
//TSecurityQualityOfService - SECURITY_QUALITY_OF_SERVICE(结构体)
//PSecurityQualityOfService - intPtr
//PUINT - intPtr
[DllImport("user32.dll", EntryPoint = "GetClassName")]
public static extern int GetClassName(IntPtr hwnd,string lpString, int cch);
楼主这个声明是有问题提的 VB 默认都是引用传递
不是楼主类型错了其实是少了 ref 关键子或者应该改成 System.Text.StringBuilder
转换 api 中不单纯是类型转换,还要看api到底是否传递,还有api 是否是单一的很多api
针对unicode 和ansi 会有两个函数如 GetClassName 就是 GetClassNameA 和 GetClassNameW
EntryPoint = GetClassName 也错了
正确的使用方式应该是
C# code
[DllImport("user32.dll", CharSet=CharSet.Auto /*根据sdk帮助得知 GetClassName 有w 和 a 两种我们选择自动即可*/ )]
public static extern int GetClassName(IntPtr hwnd,/*API中的输入输出字符串对应 StringBuilder */ StringBuilder lpString, int cch);
//使用的时候
StringBuilder sb = new StringBuilder(256);
GetClassName(this.Handle,sb,256);
Debug.WriteLine(sb.ToString());
C/C++ code
//VC winuser.h 内的 GetClassNameA
WINUSERAPI
int
WINAPI
GetClassNameA(
__in HWND hWnd,
__out_ecount_part(nMaxCount, return) LPSTR lpClassName,
__in int nMaxCount
);
WINUSERAPI
int
WINAPI
GetClassNameW(
__in HWND hWnd,
__out_ecount_part(nMaxCount, return) LPWSTR lpClassName,
__in int nMaxCount
);
#ifdef UNICODE
#define GetClassName GetClassNameW
#else
#define GetClassName GetClassNameA
#endif // !UNICODE
所以说.net to win32 并不是简单的类型转换主要还是要看,
1)函数是否是有unicode 类型 就是存在 W 和 A 结尾的两种?
2)参数那个是 in 的或的 inout 的单纯 out 的api 内应该没有,我是没看见过反正;
3)最后才是类型对应其实win32 api 基础类型就是 byte[],byte,int32,uint32,int16,uint16 很少有int64
你看到的hwnd等其实都是宏转换的在win32系统就是Int32,win64 是 int64
HWND to IntPtr (这类其实 uint32,int 都可以)
LPSTR LPWSTR TCHAR CHAR 等等都是string 或 StringBuilder
其实类型最难的是结构体,尤其是里面带字符串或字符数组的那种,我一般都有 byte[]
取回来在吧byte转换层串;比较麻烦的其实;注意uincode 函数中的char 对应.net char
ansi 的对应 byte
祝你成功;不知道老板给你多长时间,估计这东西我写也得写好久也很难保证全部api 都好使;
反过来使用的时候还有狠多说道;如上边的 GetClassName 在老VB下绝对不是哪么用的!