最近做一个私人项目,一个模块用到了较多的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下绝对不是哪么用的!