把api函數集全部封裝,做成一個程序集,這樣c#程序中只要引用此DLL,就可以直接使用某api函數(程序集win32api.dll 含1500多api,6000多常量聲明,400多個api調用使用的結構體聲明)
做了如下嘗試:
1、參考了一些網站,例如“http://www.webtropy.com/articles/Win32-API-DllImport-art9.asp?Windows+API”
但是,發現他聲明的函數參數也有些處理的不好,而且結構體聲明,居然只有一個頁面有(好像是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下絕對不是哪麼用的!