TIPS > DLLの利用

作成中

概要

  • Win32APIクラスを用いると、WindowsでRubyからDLLを利用できます。

  • WinInet.dllのInternetCrackUrl()を用いた例を以下に示します。
    • WinInet.dllはHTTPやFTP通信APIを提供し、InternetExplorerなどでも用いられています。
    • InternetCrakUrl()は引数のURLを構成要素に分解します。

+ dlの例
require 'dl/struct'
require 'dl/import'
 
module WININET
  extend DL::Importable
  dlload('winInet.dll')
  typealias('BOOL', 'unsigned int')
  typealias('DWORD', 'unsigned long')
  typealias('LPSTR', 'char *')
  typealias('INTERNET_SCHEME', 'int')
  typealias('INTERNET_PORT', 'unsigned short')
  UrlComponent_t = struct ["DWORD  dwStructSize",
                         "LPSTR   lpszScheme",
                         "DWORD   dwSchemeLength",
                         "INTERNET_SCHEME nScheme",
                         "LPSTR   lpszHostName",
                         "DWORD   dwHostNameLength",
                         "INTERNET_PORT nPort",
                         "LPSTR   lpszUserName",
                         "DWORD   dwUserNameLength",
                         "LPSTR   lpszPassword",
                         "DWORD   dwPasswordLength",
                         "LPSTR   lpszUrlPath",
                         "DWORD   dwUrlPathLength",
                         "LPSTR   lpszExtraInfo",
                         "DWORD   dwExtraInfoLength"]
  extern('BOOL InternetCrackUrl(const char *, DWORD, DWORD, void *)')
end
 
uc = WININET::UrlComponent_t.malloc
uc.dwStructSize = uc.size
uc.lpszScheme = "\0" * 100
uc.dwSchemeLength = 100
uc.nScheme = 0
uc.lpszHostName = "\0" * 100
uc.dwHostNameLength = 100
uc.nPort = 0
uc.lpszUserName = "\0" * 100
uc.dwUserNameLength = 100
uc.lpszPassword = "\0" * 100
uc.dwPasswordLength = 100
uc.lpszUrlPath = "\0" * 100
uc.dwUrlPathLength = 100
uc.lpszExtraInfo = "\0" * 100
uc.dwExtraInfoLength = 100
 
p WININET::internetCrackUrl("http://localhost/test", 0, 0, uc)
print uc.lpszScheme
 

+ win32apiの例1
require 'Win32API'
 
class Test
  def initialize
     @crackUrl = Win32API.new('WinInet.dll', 
                              'InternetCrackUrl', 
                              'p l l p', 
                              'i')
  end
  attr_reader :uc
 
  def crackUrl(url)
    urlComponent = Struct.new(:dwStructSize, 
                    :lpszScheme, 
                    :dwSchemeLength,
                    :nScheme,
                    :lpszHostName,
                    :dwHostNameLength,
                    :nPort,
                    :lpszUserName,
                    :dwUserNameLength,
                    :lpszPassword,
                    :dwPasswordLength,
                    :lpszUrlPath,
                    :dwUrlPathLength,
                    :lpszExtraInfo,
                    :dwExtraInfoLength)
    @uc = urlComponent.new
    @uc.dwStructSize = 60
    @uc.lpszScheme = " " * 100
    @uc.dwSchemeLength = 100
    @uc.nScheme = 0
    @uc.lpszHostName = " " * 100
    @uc.dwHostNameLength = 100
    @uc.nPort = 100
    @uc.lpszUserName = " " * 100
    @uc.dwUserNameLength = 100
    @uc.lpszPassword = " " * 100
    @uc.dwPasswordLength = 100
    @uc.lpszUrlPath = " " * 100
    @uc.dwUrlPathLength = 100
    @uc.lpszExtraInfo = " " * 100
    @uc.dwExtraInfoLength = 100
    rc = @crackUrl.call(url, 0, 0, @uc.to_a.pack('L!pL!i!pL!i!pL!pL!pL!pL!'))
    return rc
  end
end
 
test = Test.new
p test.crackUrl("http://localhost/test?query=true")
p test.uc.lpszScheme
 

+ win32apiの例2
require 'Win32API'
 
class Test
  def initialize
     @crackUrl = Win32API.new('WinInet.dll', 
                              'InternetCrackUrl', 
                              %w(p l l p), 
                              'i')
  end
  attr_reader :uc
 
  def crackUrl(url)
    uc = [60, 
          " "*100, 
          100, 
          0,
          " "*100, 
          100, 
          0, 
          " "*100, 
          100, 
          " "*100, 
          100, 
          " "*100, 
          100, 
          " "*100, 
          100].pack('L!pL!i!pL!i!pL!pL!pL!pL!')
    rc = @crackUrl.call(url, 0, 0, uc)
    @uc = uc.unpack('L!pL!i!pL!i!pL!pL!pL!pL!')
    return rc
  end
end
 
test = Test.new
p test.crackUrl("http://localhost/test?query=true")
p test.uc
 
最終更新:2008年07月24日 13:20