API函數的使用的列表

最近做一個私人項目,一個模塊用到了較多的api。覺得c#中(我原來是做delphi的),使用api函數較爲不便,就萌生了
把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下絕對不是哪麼用的!
發佈了25 篇原創文章 · 獲贊 1 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章