ruby中Win32API调用
一直很困惑下面ruby中使用Win32API
调用时,参数中的类型和MSDN上的怎么对应的,今天终于找到对应关系表了
Win32API
调用函数:
Win32API.new(dllname, proc, import, export)
加载名为dllname的DLL,生成API函数proc的对象。在import中指定proc的参数类型列表,在export中指定proc返回值的类型。
使用下列字符串或数组来指定类型。
"p"
指针"n"
,"l"
long"i"
int"v"
void
若import为nil
,则看成是没有参数。若export为nil
,则看做是没有返回值(void
)。
数据类型的对应关系在下面文件中定义的
C:\ruby\lib\ruby\gems\1.8\gems\windows-api-0.4.0\lib\windows\api.rb
# Verbose data types that can be used instead of single letters
DATA_TYPES = {
'ATOM' => 'I',
'BOOL' => 'B',
'BOOLEAN' => 'B',
'BYTE' => 'I',
'CALLBACK' => 'K',
'CHAR' => 'I',
'COLORREF' => 'L',
'DWORD' => 'L',
'DWORDLONG' => 'L',
'DWORD_PTR' => 'P',
'DWORD32' => 'I',
'DWORD64' => 'L',
'HACCEL' => 'L',
'HANDLE' => 'L',
'HBITMAP' => 'L',
'HBRUSH' => 'L',
'HCOLORSPACE' => 'L',
'HCONV' => 'L',
'HDC' => 'L',
'HFILE' => 'I',
'HKEY' => 'L',
'HFONT' => 'L',
'HINSTANCE' => 'L',
'HKEY' => 'L',
'HLOCAL' => 'L',
'HMENU' => 'L',
'HMODULE' => 'L',
'HRESULT' => 'L',
'HWND' => 'L',
'INT' => 'I',
'INT_PTR' => 'P',
'INT32' => 'I',
'INT64' => 'L',
'LANGID' => 'I',
'LCID' => 'L',
'LCTYPE' => 'L',
'LONG' => 'L',
'LONGLONG' => 'L',
'LONG_PTR' => 'P',
'LONG32' => 'L',
'LONG64' => 'L',
'LPARAM' => 'P',
'LPBOOL' => 'P',
'LPBYTE' => 'P',
'LPCOLORREF' => 'P',
'LPCSTR' => 'P',
'LPCTSTR' => 'P',
'LPCVOID' => 'L',
'LPCWSTR' => 'P',
'LPDWORD' => 'P',
'LPHANDLE' => 'P',
'LPINT' => 'P',
'LPLONG' => 'P',
'LPSTR' => 'P',
'LPTSTR' => 'P',
'LPVOID' => 'L',
'LPWORD' => 'P',
'LPWSTR' => 'P',
'LRESULT' => 'P',
'PBOOL' => 'P',
'PBOOLEAN' => 'P',
'PBYTE' => 'P',
'PHKEY' => 'P',
'SC_HANDLE' => 'L',
'SC_LOCK' => 'L',
'SERVICE_STATUS_HANDLE' => 'L',
'SHORT' => 'I',
'SIZE_T' => 'P',
'TCHAR' => 'L',
'UINT' => 'I',
'UINT_PTR' => 'P',
'UINT32' => 'I',
'UINT64' => 'L',
'ULONG' => 'L',
'ULONGLONG' => 'L',
'ULONG_PTR' => 'P',
'ULONG32' => 'L',
'ULONG64' => 'L',
'USHORT' => 'I',
'USN' => 'L',
'WINAPI' => 'L',
'WORD' => 'I'
}
DATA_TYPES = {
'ATOM' => 'I',
'BOOL' => 'B',
'BOOLEAN' => 'B',
'BYTE' => 'I',
'CALLBACK' => 'K',
'CHAR' => 'I',
'COLORREF' => 'L',
'DWORD' => 'L',
'DWORDLONG' => 'L',
'DWORD_PTR' => 'P',
'DWORD32' => 'I',
'DWORD64' => 'L',
'HACCEL' => 'L',
'HANDLE' => 'L',
'HBITMAP' => 'L',
'HBRUSH' => 'L',
'HCOLORSPACE' => 'L',
'HCONV' => 'L',
'HDC' => 'L',
'HFILE' => 'I',
'HKEY' => 'L',
'HFONT' => 'L',
'HINSTANCE' => 'L',
'HKEY' => 'L',
'HLOCAL' => 'L',
'HMENU' => 'L',
'HMODULE' => 'L',
'HRESULT' => 'L',
'HWND' => 'L',
'INT' => 'I',
'INT_PTR' => 'P',
'INT32' => 'I',
'INT64' => 'L',
'LANGID' => 'I',
'LCID' => 'L',
'LCTYPE' => 'L',
'LONG' => 'L',
'LONGLONG' => 'L',
'LONG_PTR' => 'P',
'LONG32' => 'L',
'LONG64' => 'L',
'LPARAM' => 'P',
'LPBOOL' => 'P',
'LPBYTE' => 'P',
'LPCOLORREF' => 'P',
'LPCSTR' => 'P',
'LPCTSTR' => 'P',
'LPCVOID' => 'L',
'LPCWSTR' => 'P',
'LPDWORD' => 'P',
'LPHANDLE' => 'P',
'LPINT' => 'P',
'LPLONG' => 'P',
'LPSTR' => 'P',
'LPTSTR' => 'P',
'LPVOID' => 'L',
'LPWORD' => 'P',
'LPWSTR' => 'P',
'LRESULT' => 'P',
'PBOOL' => 'P',
'PBOOLEAN' => 'P',
'PBYTE' => 'P',
'PHKEY' => 'P',
'SC_HANDLE' => 'L',
'SC_LOCK' => 'L',
'SERVICE_STATUS_HANDLE' => 'L',
'SHORT' => 'I',
'SIZE_T' => 'P',
'TCHAR' => 'L',
'UINT' => 'I',
'UINT_PTR' => 'P',
'UINT32' => 'I',
'UINT64' => 'L',
'ULONG' => 'L',
'ULONGLONG' => 'L',
'ULONG_PTR' => 'P',
'ULONG32' => 'L',
'ULONG64' => 'L',
'USHORT' => 'I',
'USN' => 'L',
'WINAPI' => 'L',
'WORD' => 'I'
}
如MSDN上的函数原型为:
WinExec
ruby调用时方法为:Win32API.new("kernel32", "WinExec", ['P','L'], 'L')