自作OCXでregsvr32実行時LoadLibraryでハング

[戻る]
The_Night 2005/01/09(日) 19:30:14
初めまして。
VC++6.0 SP5 Win2000で開発をしております。
既存の独自OCXに対し、
MFCを利用した独自DLL(COMではないDLL)
を利用するような機能追加をしたところ、
実行環境でRegSvr32でのレジスト及び、アンレジスト時、
RegSvr32がハングアップするようになってしまいました。
(/Sをつけていない状態で実行しても、成功or失敗ダイアログが表示されず、
タスクマネージャに、RegSvr32が残ったままとなっています。)
開発環境で、同じようにRegSvr32を実行しても、問題は発生しません。
(RegSvr32は、成功のダイアログを表示します。)

ネットで検索していたところ、
regsvr32の行っている処理の簡易版のソースがあったため、
これを利用して、ログを出す簡易regsvr32を作ってみたところ、
どうやら、LoadLibraryから応答がなく止まっているようです。

さらにネットで調査していると、LoadLibraryが失敗する原因として、
「必要なDLLが参照できないとNG」とありましたので、
VisualStudio添付ツールのDependency Walker で確認しましたが、
全てのDLL(新設DLLも)問題なく表示されているようです。

実行環境には、旧OCXが登録されていた状態でしたので、
OCXファイルのみを置き換え(RegSvr32でのレジスト無し)で
OCXを利用したプログラムを実行したところ、
新設のDLLを利用した処理を含め、正常に動作するようです。
このことから、新設のDLLへの参照が不良ということでもなさそうです。

どなかた、同じような経験をされたかたは、おりませんでしょうか?

RAPT 2005/01/10(月) 13:33:59
実行環境と開発環境が異なっているようですが、実行環境の環境は?
LoadLibraryExを使っても再現しますか?

以前、リソースファイルを読み込むのに、Windows2000で開発、
Windows98で実行の際、LoadLibraryがWindows2000では成功するのに、
Windows98では失敗することがありました。
このときは、LoadLibraryExを使う事で回避できました。

The_Night 2005/01/10(月) 16:47:09
PART様

ご意見ありがとうございます。
実行環境は、開発環境と同じくWin2000を使用しております。
(SPも、統一してあります。)
業務アプリケーションであるため、
環境については、動作保証環境を開発環境と同一で強制できている状態です。

LoadLibraryExについては、試してみたいと思います。
ただ、標準的なツールであるRegSvr32で止まってしまうのは、
少々問題ありな気がしております。(^^;;

また、本当に、新規追加のDLLが悪影響をしているかどうかも
試してみます。
新規追加DLLの機能追加以外に、
少々手直しを入れているため、諸悪の根源を突き止める必要があるかと。。。
自己努力で何かわかれば、また、寄稿致します。

ブラックボックス部分で止まってしまわれると、
私のような、初心者同然の者には、キツイです。(汗)

The_Night 2005/01/11(火) 21:38:45
[[解決]]
自己解決です。

新規追加したDLLは、別の担当者が作ったもので、
自分は、テスト用スタブのつもりでいました。
中身が気になりましたので、
何か、DLL類を使っていないか?と、
聞いてみたところ、
VBで作成したActiveX DLLを使っていました。
VC++のウィザードで、ラッパークラスを作って利用しており、
実行時に動的にクラス名から、ロードしていたようです。
このActiveXDLLを実行環境にコピーしたところ、
正常に動作しました。

古いスレッドには追加発言できません。