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

importnil,则看成是没有参数。若exportnil,则看做是没有返回值(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 '
      }      
      

 

如MSDN上的函数原型为:

 

WinExec

 

ruby调用时方法为:Win32API.new("kernel32", "WinExec", ['P','L'], 'L')

你可能感兴趣的:(Win32)