染谷と申します。

現在、Felicaのデータを読み込むプログラムを勉強しています。

そこで、felicalibというライブラリがあることを知ったのですが、
どうもうまく利用ができません。

もしかすると、自分のやり方が間違っているのではと思い、
投稿しました。

felicalibを利用するためのプログラムは以下の通りです。

=================================================================
require 'dl/import'

module FelicaLib
    extend DL::Importable
    #dlload 'felicalib.lib'
    dlload 'felicalib.dll'

    typealias("uint8",  "unsigned char")
    typealias("uint16", "unsigned int")
    typealias("uint16", "unsigned short int")

    #=========================================================================
=#
    #== felicalib.h
    #=========================================================================
=#
    extern "pasori* pasori_open(char*)"
    extern "void pasori_close(pasori*)"
#    extern "int pasori_send(pasori*,uint8*,uint8,int)"
#    extern "int pasori_recv(pasori*,uint8*,uint8,int)"

    extern "felica* felica_polling(pasori *, uint16, uint8, uint8)"
    extern "void felica_free(felica *f)"
    extern "void felica_getidm(felica *f, uint8 *buf)"
    extern "void felica_getpmm(felica *f, uint8 *buf)"

    extern "int felica_read_without_encryption02(felica *f, int servicecode, i
nt mode, uint8 addr, uint8 *b)"

    extern "int felica_write_without_encryption(felica *f, int servicecode, ui
nt8 addr, uint8 *b)" # 警告:テストを実施していない。

    extern "felica * felica_enum_systemcode(pasori *p)"
    extern "felica * felica_enum_service(pasori *p, uint16 systemcode)"

    #=========================================================================
=#
    #== constants
    #== システムコード (ネットワークバイトオーダ/ビックエンディアンで表記)
    #=========================================================================
=#
    POLLING_ANY   = 0xffff
    POLLING_SUICA = 0x0003   # システムコード: サイバネ領域
    POLLING_EDY   = 0xfe00   # システムコード: 共通領域 (Edy などが使用)

end

module FelicaLib
    class << self
        def felica_raw_values(systemcode, servicecode, little_endian = false)
            values = []
            b = Array.new(4).to_ptr
            psr = pasori_open ""
            pasori_init psr
            flc = felica_polling psr, systemcode, 0, 0
            i = 0
            while felica_read_without_encryption02(flc, servicecode, 0, i, b) 
== 0
                row = b.to_a('I')
                data = ""
                row.size.times do |j|
                    if little_endian
                        4.times { |k| data += sprintf "%02x", (row[j].to_i >> 
(8 * k)) & 0xff }
                    else
                        data += sprintf "%08x", row[j].to_i & 0xffffffff
                    end
                end
                yield data if block_given?
                values << data
                i += 1
            end
            pasori_close psr
            values
        end
    end
end
=================================================================

上記プログラムは、felicalibの紹介しているHPで取得しました。
(一部、変更しています)

そして、テストプログラムは以下の通りになります。

=================================================================
require 'felicalib'

FelicaLib.felica_raw_values(FelicaLib::POLLING_SUICA, FelicaLib::SERVICE_SUICA
,true) do |data|
   puts data
end

=================================================================

しかし、実行すると以下のメッセージが表示されます。

=================================================================
C:\SIGMA21\LIB>felica_dump.rb
C:/ruby-1.8/lib/ruby/1.8/dl/import.rb:126:in `symbol': can't find the symbol `
fe
lica_polling' (RuntimeError)
        from C:/ruby-1.8/lib/ruby/1.8/dl/import.rb:145:in `import'
        from C:/ruby-1.8/lib/ruby/1.8/dl/import.rb:61:in `extern'
        from C:\SIGMA21\LIB/felicalib.rb:20
        from C:/SIGMA21/LIB/felica_dump.rb:1:in `require'
        from C:/SIGMA21/LIB/felica_dump.rb:1
=================================================================

何が間違っているのか、誠に申し訳ございませんが、何方かご教授ください。

以上