04

22

[Ruby] Win32APIライブラリで自作のDLLを読み込んで使おうとするとLoadErrorが起きる

2013.04.22(00:42)

Win32APIライブラリで自作のDLLを読み込んで使おうとするとLoadErrorが起きる

以下のようなLoadErrorが出ていました。

d:/Ruby200/lib/ruby/2.0.0/Win32API.rb:14:in `initialize': No such file or direct
ory (LoadError)
        from d:/Ruby200/lib/ruby/2.0.0/Win32API.rb:14:in `dlopen'
        from d:/Ruby200/lib/ruby/2.0.0/Win32API.rb:14:in `initialize'

Visual Studio 2010のVisual C++でDLLを作成し、
RubyからWin32APIを使って呼び出そうと思いました。
自宅にある4台のWindows7 / WindowsXP 機で
それを動かしてみたところ、3台は動作し、1台はLoadErrorで動作しません。
その1台でどうして動かないのか、1日悩みました。

おりしも、Ruby2.0.0にした直後で、
DL is deprecated, please use Fiddle
というエラーが出ていてDLLに近そうなところだし、そこが原因かと
Rubyのライブラリを読み、自作のDLLも確認しました。

Rubyのせいでも、DLLのせいでもなさそうなので、
DLLを呼び出す普通のWin32コンソールアプリを作って、
動く環境で確認し、動かないPCに持って行ったところ、
「MSVCR100.DLL が見つからなかったため、アプリケーションを開始できませんでした 」
エラーが出てわかりました。

RubyからWin32APIライブラリ経由で自作のDLLを呼び出すためには、
Rubyと自作のDLL以外に、
C:\WINDOWS\system32
ディレクトリに
msvcr100.dll 
が必要です。

Visual StudioをインストールしたPCでは動作し、
インストールしていないPCでは動作しなかった、
ただそれだけでした。
Rubyのバージョンも、Windows7/WindowsXPの違いも関係ありませんでした。

MSVCR100.DLL
をインストールするには、
「Microsoft Visual C++ 2010 SP1 再頒布可能パッケージ」
をググって、
それ、または、それと同様の名前の新しそうなものをインストールすればよいです。
WindowsXPでは、x86版を
Windows7 32ビットなら、x86版を
Windows7 64ビットなら、x64版をいれればよいでしょう。

WindowsXPでは、
C:\WINDOWS\system32\MSVCR100.DLL
に入るので確認してください。

試しにこのDLLを改名すると、さきほどのエラーが再発します。
プロフィール

島敏博

Shima Toshihiro 島敏博
信州アルプスハイランド在住。HaskellとElixirが好き。組み込みソフトウェアアーキテクト、C++プログラマ、山歩き、美術館巡り、和食食べ歩き、日本赤十字社救急法指導員、インデックス投資、クラシック音楽、SESSAME会員、状態マシン設計、モデル駆動開発、ソフトウェアプロダクトライン、Rubyist、実践ビジネス英語

■ ツイッター
http://twitter.com/saltheads
■ Facebook
http://www.facebook.com/saltheads
■ Qiita
http://qiita.com/saltheads

印刷する場合は、ブラウザの印刷メニューではなく、このページの上から3cmくらいの青いところにある、「印刷」を押してみてください。少しうまく印刷できます。まだ完全ではないのですが、これで勘弁してください。


カテゴリ
最新記事
月別アーカイブ
最新コメント
検索フォーム
リンク
sessame
RSSリンクの表示