Windowsのコマンドプロンプトで「regsvr32」を使いモジュールを登録しようとしたところ“モジュール"xxx"は、実行しているWindowsのバージョンと互換性がない可能性があります。モジュールがx86(32ビット)バージョンまたはx64(64ビット)バージョンのregsvr32と互換性があることを確認してください。”というエラーが出ました。
初めはエラーの原因が良く分からなかったのですが、どうやら作業ディレクトリやモジュールのパスが間違っている時にもこのエラーが出るようです。
初見時は意味不明だったので、この記事で解決の糸口を共有したいと思います。
今回は拡張子が「.ocx」のモジュールでこのエラーが出ましたが「.dll」などの他の拡張子の場合でも同じエラーが出ることがあります。
この記事の目次
regsvr32で互換性がない可能性がありますというエラーが出た時の確認
先日アプリケーション拡張(.dll)やActiveXコントロール(.ocx)を登録、登録解除する時に使用する「regsvr32コマンド」を使って、mscomctl.ocxというモジュールを登録しようとしたところ以下のようなエラーが出ました。
モジュール"mscomctl.ocx"は、実行しているWindowsのバージョンと互換性がない可能性があります。モジュールがx86(32ビット)バージョンまたはx64(64ビット)バージョンのregsvr32と互換性があることを確認してください。
エラーの内容は分かりますが、今回登録しようとしたmscomctl.ocxは32ビットのもので、しかも以前に別のパソコン(64ビット)にも入れたことがあるモジュールだったので解決するのに苦労しました。のでこの時の内容を記事にします。
色々試した結果、モジュール(mscomctl.ocx)の方には何の問題もなく、ただ単にregsver32実行時のパス(作業ディレクトリ)を間違えていただけでした。
では早速詳しく見ていきましょう・w・
エラーが出る時はパスを確認する
アプリケーション拡張(.dll)やActiveXコントロール(.ocx)をregsver32で登録する時は以下のどちらかのフォルダにモジュールを配置することが殆どだと思います。
- C:¥Windows¥Sytem32
- C:¥Windows¥SysWOW64
32bitなら「System32」へ...64bitなら「SysWOW64」へ...と良く書かれていますね。
ここら辺の勘違いが多いのはこの記事では置いておいて、このフォルダへモジュールを配置したとして進めていきます。
配置場所についても詳しくは書きませんが、どちらのフォルダに配置すれば良いのか分からないなら、両方のフォルダに配置してしまっても特に問題は起こりません。
同じモジュールが「System32」と「SysWOW64」に存在する事もありますので...
モジュールを配置したあと、regsvr32で「互換性があることを確認してください。」という旨のエラーが出た時にまず確認していただきたいのが、コマンドプロンプトを管理者権限で実行しているかどうかです。特に「System32」を使っているなら...
regsver32コマンドの実行は管理者権限で行う
エラーの直接の原因は管理者権限ではなく、作業ディレクトリにあります。
regsvr32コマンド自体は別に管理者でなくても実行することが可能です。
ただ、Windowsのデスクトップからコマンドプロンプトを普通に起動した場合、作業ディレクトリが「C:¥Users¥ユーザー名」になることが厄介なのです。
具体的なコマンドで例えると、
command C:¥Users¥ユーザー名>regsver32 mscomctl.ocx
これではエラーが出ます。(記事冒頭の画像)
ポイント
登録したいmscomctl.ocxというモジュールは「System32」に配置しています。
続いてコマンドプロンプトを管理者権限で実行してみます。
管理者権限で実行するには、検索欄に「cmd」と打ち込み、コマンドプロンプトが出たら「管理者として実行」を押せばOKです。
(コマンドプロンプトを右クリックして「管理者として実行」を選んでもOKです。)
先ほどと同じコマンドregsver32 mscomctl.ocx
を叩いてみましょう。
成功しました。
この時のコマンドのパスは、
command C:¥WINDOWS¥system32>regsver32 mscomctl.ocx
という感じです。コマンドプロンプトを管理者権限で実行すると、作業ディレクトリが「C:¥WINDOWS¥system32」からスタートするのが今回のミソです。
つまりregsvr32はパソコンに登録するモジュールがあるフォルダを作業ディレクトリにしてから実行しないとダメという事です...
今回出たエラーには“互換性の確認”って書いてるけど。全然違うじゃん。
更にシンプルに言うと「C:¥Windows¥Sytem32」にregsvr32で登録したいモジュールを配置している場合は、コマンドプロンプトを管理者権限で実行するだけで上手くいくはずです。
SysWOW64にモジュールを配置した場合
続いて、登録したいモジュールを「C:¥Windows¥SysWOW64」に配置した場合です。
最近は64ビットのOSが主流なので「SysWOW64」を使うことが多いでしょう。
この場合も先ほど同様、regsver32の実行前にコマンドプロンプトの作業ディレクトリを「C:¥Windows¥SysWOW64」に変更してからregsver32を実行すればOKです。
つまり、regsver32を実行する前に
command
cd C:\Windows\SysWOW64
という風にcdコマンドで作業ディレクトリを「SysWOW64」に変更すればOK!
成功しました。
cdコマンドを使わずにパスを指定してもOK
先ほどは、分かりやすいようにcdで作業ディレクトリを変更してからregsver32を実行しましたがcdを使わなくてもできます。
php.ini
C:\Windows\SysWOW64\regsvr32 mscomctl.ocx
こんな感じにregsvr32の前にモジュールまでのパスを書けば一発でいけます。
とにかくコマンドプロンプトの作業ディレクトリ、モジュールのパスが大切です。
エラーが解決できたコマンド例
長くなったので最後にモジュールの配置場所とコマンドの対応をまとめておきます。
Sytem32フォルダ内に配置した場合
C:¥Windows¥Sytem32の中にregsvr32で登録したいモジュール(mscomctl.ocx)を配置している場合は、コマンドプロンプトを管理者権限で実行してから下のコマンドを実行すればOKでした。
command
regsver32 mscomctl.ocx
SysWOW64フォルダ内に配置した場合
C:¥Windows¥SysWOW64の中にregsvr32で登録したいモジュール(mscomctl.ocx)を配置した時は以下のコードです。
command
cd C:\Windows\SysWOW64
regsvr32 mscomctl.ocx
または、
command
C:\Windows\SysWOW64\regsvr32 mscomctl.ocx
ポイントはregsvr32を実行する作業ディレクトリです。
まとめ
以上、Windowsのコマンドプロンプトでregsvr32コマンドを実行した時に「モジュール"xxx"は、実行しているWindowsのバージョンと互換性がない可能性があります。モジュールがx86(32ビット)バージョンまたはx64(64ビット)バージョンのregsvr32と互換性があることを確認してください。」というエラーが出てしまう時の確認でした。
もちろんエラーの通りモジュールに本当に互換性がない場合や、モジュール本体が壊れている可能性もあるとは思いますが、大体は作業ディレクトリとパスが原因になると思います。