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')

posted @ 2009-11-13 15:21  赵献良  阅读(1316)  评论(0编辑  收藏  举报