Visual C++ 7.1 で作成した COM を登録する
MEMORANDUM
Windows Server 2003 上で、従来通りコマンドプロンプトを使用して COM コンポーネントを登録しようとしたところ、上手く登録できませんでした。
必要な DLL を揃えた上で、いったんコンポーネントサービスを用いてコンポーネントを登録したところ、とりあえず登録できるようになりました。
Visual C++ 7.1 で作成した COM を登録する
■ はじめに
ここの備忘録は、あくまでも走り書き程度のメモ的なものですので気をつけてください。
そのままでもちゃんと動くもの、手を加えないとだめなものなど、未完成レベルのコードです。ので、そのまま引用してしまうなど、プログラムを理解する知識のない方は利用しないでくださいね。
■ 概要
ようやく Visual C++ 7.1 で満足の行く COM が作成できる環境が整ったため、さっそく以前に作成したものを移行したのですけど、そのコンポーネントを登録しようとして少しだけ問題にぶつかってしまったのでした。COM を登録しようとした環境は Windows Server 2003 です。
■ モジュールが見つからない
Windows Server 2003 上で、今までどおり、コマンドプロンプトから次のような感じで COM コンポーネントを登録しようとしました。
regsvr32 TEST.DLL
いままでならば、もっとも Visual C++ 6.0 では MinDependency ビルド構成での場合でしたけど、問題なく COM をインストールすることが出来ていました。ところが今回、このように登録しようとしてみると、 "指定されたモジュールが見つかりません" とのエラーが出てしまうのでした。
以前の経験から、これはたしか、COM が依存している DLL が見つからないときに出ていたエラーだった気がします。
そう思って、Visual C++ 6.0 についていた "Dependency Walker" というソフトウェアをつかって、この COM の依存関係を調べてみると、次の DLL が特に、重要なようでした。
- MSVCR71.DLL
- MSVCP71.DLL
これらが Windows Server 2003 上では欠けているようなのでした。
そこで Visual Studio .NET 2003 にて、インストールウィザードを作り、依存関係のファイルも一緒にインストールされるようにしてみたのですけど…。
予想通り、上記2つも一緒にインストールされたのですけど、いざ regsvr32 をインストールしてみようとすると、再び同じエラーが発生してしまいました。パスが通っていないからかとも思い、パスの通ったディレクトリへコピーしたりもしてみたのですけど、一向に改善される感じがありませんでした。
■ コンポーネントサービス
調べている最中に、もしかすると 「システムの保護」 関連の仕組みが災いするような…、そんな情報を入手しました。噂の域の情報なのですけどね、確かにありえなくもなさそうだったので、出来るだけ正当な手続きでインストールする方法がないか模索してみました。
いろいろ考えたところ、もしかすると、コントロールパネルの 「コンポーネントサービス」 を使えばうまく出来るのではないか…、そう思って早速やってみることにしました。
新しく COM+ アプリケーションを作成して、そこへ新しくコンポーネントを追加します。
追加の際に、追加したい DLL を指定してみると…、しっかりと認識されてくれたのでした。とりあえずこれで無事解決なのですけど、そのあと改めて、手動で regsvr32 を使って再登録を行ってみると、なぜだか正常に登録することができました。いったん /u でアンインストールしてからでもちゃんと登録できます。
いったん登録したからクリアなのでしょうか…、それとも何か勘違いしていたのでしょうか。
…
本当は、Visual C++ 7.1 がビルド時に登録するオプションに /c というのがついていたのが気になってやってみようと思ったのですけど、うまく行ってしまったのでこれが何か意味を成しているのかどうか知ることは出来ませんでした。