tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルVisualStudioの設定のリセットについて
記事No6776
投稿日: 2008/01/09(Wed) 13:56
投稿者たると
いつもお世話になっています。VB2005を使用してプログラムの作成を行っています。
作成しているプログラムがソースコードを変更していないにもかかわらず、コンパイルができなくなってしまったため質問させてください。

ソースコードでエラーが出るのはライブラリの参照を行っている場所なのですが、
コンパイラから「問題が発生したため、Microsoft(R) Visual Basic Compilerを終了します。」というウィンドウが表示されます、ウィンドウを閉じるとデバック画面に戻ります。
デバック画面に戻ってからステップ実行を行おうとすると、その場で警告のウィンドウが表示され、Exceptionはハンドルされませんでした。CLSID {465B2FBF-6114-48A1-8037-29208D051732} を含むコンポーネントの COM クラス ファクトリを取得中に、次のエラーが発生しました: 80040154。

と表示されます。最初はどこかソースを書き換えてしまったのがと思い以前のプログラムを立ち上げてみたのですが、こちらでも同じ場所でエラーが出ます。(他のPCにうつし変えてコンパイルしたところ違うPCではコンパイルできました)。

参照しているDLLのファイルも確認しましたが、場所は変更した覚えがなくファイルの位置もあっています。

コンパイルが通らなくなる前はセットアッププロジェクトの作成をしていました。
セットアップファイルを作成したときにVisualStudioの設定を変更してしまったのかと思い、[ツール]-[設定のインポートとエクスポート]からリセットをかけてみましたが、ダメでした。
一度VisualStudioをアンインストール後、ふたたびインストールをしてみましたがこちらもダメでした。
どこかに以前入れていたVisiualStudioの設定が残っていて、インストールしたときにまた参照してしまったのでしょうか?それとも、どこかちがうところに問題があるのでしょうか?

どうかよろしくお願いします。

[ツリー表示へ]
タイトルRe: VisualStudioの設定のリセットについて
記事No6777
投稿日: 2008/01/09(Wed) 15:04
投稿者魔界の仮面弁士
VB 側の問題ではなく、OS 環境側の問題のようですね。

その問題が起きる前に、何か、インストールやアンインストールなどの作業を
行った覚えはありませんか? OS の「復元ポイント」を使って、以前の状態に戻せば、
運が良ければ復活するかも知れません。


> CLSID {465B2FBF-6114-48A1-8037-29208D051732} を含むコンポーネントの
正常に動作する PC にて、レジストリなどから、その CLSID を持つコンポーネントを
探してみてください。

恐らくは、そのコンポーネントが正しくインストールされていない状態であるか、
あるいは、オブジェクト インスタンスの生成に必要な権限が不足しているとか、
その DLL (あるいは、DLL が依存しているファイル群)が破損/欠損しているなどの
理由により、正しく呼び出せない状態なのだと思います。

[ツリー表示へ]
タイトルRe^2: VisualStudioの設定のリセットについて
記事No6778
投稿日: 2008/01/09(Wed) 18:21
投稿者たると
お返事ありがとうございます。

動くほうのPCで同じような動作をしてみたところ、何度もSetupファイルの作成・削除を繰り返していると、参照しているDLLのファイルがいつの間にか削除されていることがわかりました。参照されていた位置を確認してもdllのファイルがなくなっていて参照できない状態でした。

dllのファイルが消えてしまう前にプロジェクト出力の追加を行おうとすると
「次のファイルは自動的に判断できない依存関係を持っている可能性があります。プロジェクトにすべての依存関係が追加されていることを確認してください。」
と出ていたのでなにか関係があるのでしょうか。参照していたライブラリは6.0で作成した古いものを利用していたのでそれもよくなかったのかもしれません。

しかたがないので動作していたプログラムからdllのファイルをコピーしてきて再度参照してみたのですが、今度は互換性がないと同じ場所でエラーになってしまいました。


おかげさまで、OSの復元ポイントを使って以前の状態に戻すことで復帰できました。
ただ私の場合、途中でVisual Studioの再インストールを行ったためか、
セットアッププロジェクトを立ち上げようとすると、SetupVisual Studio テンプレート情報が古くなりました。'devenv /installvstemplates' を実行してテンプレートを再生成するか、または Visual Studio を再インストールしてください。
と言われ、セットアッププロジェクトが起動できなくなってしまいましたので復元するときは注意が必要なようですね。

[ツリー表示へ]
タイトルRe^3: VisualStudioの設定のリセットについて
記事No6779
投稿日: 2008/01/09(Wed) 18:46
投稿者魔界の仮面弁士
> 次のファイルは自動的に判断できない依存関係を持っている可能性があります。
ocx の場合は、(System32 フォルダなどに)、依存情報ファイル *.dep 等がありますね。

> プロジェクトにすべての依存関係が追加されていることを確認してください
「確認してください」と報告されていますが、その確認作業に抜けがあったのかも。
実際には、どのようにして確認されましたか?

> と出ていたのでなにか関係があるのでしょうか。
もしかしたら関係があるのかも知れませんが、私は問題となるソースコードを
持っていませんし、問題の出ている DLL の名前すら分からないので、原因を
特定することはできません。すみません。m(_ _)m

> ライブラリは6.0で作成した古いものを
これは、Visual Basic 6.0 という意味でしょうか。
だとしたら、その DLL の互換モードは、「バイナリ互換」モードでコンパイルされていますか?
(プロジェクト互換であるならば、参照設定せず、レイトバインドで実行した方が無難です)


> しかたがないので動作していたプログラムからdllのファイルをコピーしてきて再度参照してみたのですが、今度は互換性がないと同じ場所でエラーになってしまいました。
その ActiveX DLL の IID、CLSID、ProgID は、どうなっていますか?

[ツリー表示へ]
タイトルRe^4: VisualStudioの設定のリセットについて
記事No6791
投稿日: 2008/01/10(Thu) 17:38
投稿者たると
こんにちは、いつもお世話になっています。

> > 次のファイルは自動的に判断できない依存関係を持っている可能性があります。
> ocx の場合は、(System32 フォルダなどに)、依存情報ファイル *.dep 等がありますね。
>
> > プロジェクトにすべての依存関係が追加されていることを確認してください
> 「確認してください」と報告されていますが、その確認作業に抜けがあったのかも。
> 実際には、どのようにして確認されましたか?

警告文の下にファイルのある位置が表示されていたので、その場所にファイルが存在するのを確認したくらいなのですが、他に確認方法があるのでしょうか?

> > と出ていたのでなにか関係があるのでしょうか。
> もしかしたら関係があるのかも知れませんが、私は問題となるソースコードを
> 持っていませんし、問題の出ている DLL の名前すら分からないので、原因を
> 特定することはできません。すみません。m(_ _)m
>
> > ライブラリは6.0で作成した古いものを
> これは、Visual Basic 6.0 という意味でしょうか。
> だとしたら、その DLL の互換モードは、「バイナリ互換」モードでコンパイルされていますか?
> (プロジェクト互換であるならば、参照設定せず、レイトバインドで実行した方が無難です)
>
>

使用しているDLLはVisual Basic6.0で作成された自作のものです。こちらはMSCOMM32.OCXを
利用しているのでそのままでは動作しないため、他のPCで動かすためにsystem32の中にMSCOMM32.OCXをコピーして動作させている状態です。配布するときにユーザーが実行ファイルを押すだけで使えるような形にしたいと思っているので、2005でなにか代用できるようなものがあれば新しく作成したいと考えています。
作成したプログラムは2005で作成したもので、このライブラリを参照するような形になっていますが、いまのところ動作します。

互換モードと言うのがよくわからないのですが、設定では「互換なし」となっていました。
これはなにか変更しないといけないのでしょうか??

> > しかたがないので動作していたプログラムからdllのファイルをコピーしてきて再度参照してみたのですが、今度は互換性がないと同じ場所でエラーになってしまいました。
> その ActiveX DLL の IID、CLSID、ProgID は、どうなっていますか?

ActiveX DLL の IID、CLSID、ProgIDをどうやって取得するのかわかりません。
調べてみたのですが、プログラムから取得する方法が検索にかかりました。
これは取得するプログラムを作成して取得するのでしょうか??

[ツリー表示へ]
タイトルRe^5: VisualStudioの設定のリセットについて
記事No6792
投稿日: 2008/01/10(Thu) 20:47
投稿者魔界の仮面弁士
> > > 「次のファイルは自動的に判断できない依存関係を持っている可能性があります。
> > > プロジェクトにすべての依存関係が追加されていることを確認してください。」
> > 実際には、どのようにして確認されましたか?
> 警告文の下にファイルのある位置が表示されていたので、その場所にファイルが存在するのを確認したくらいなのですが、他に確認方法があるのでしょうか?

警告されたファイルそのものではなく、そのファイルの依存情報が問題となります。

たとえば、C:\WINDOWS\SYSTEM32\MSCOMM32.DEP をメモ帳で開いてみてください。

COMDLG32.DEP を見ると、『MSCOMM32.OCX』というファイルが、
「COMCAT.DLL」と「MSCOMJP.DLL」に依存している事がわかります。

そのため、MSCOMM32.OCX を利用したプログラムのセットアップを構築する場合、
MSCOMJP.DLL もまた、再頒布対象として自動的にインストーラに含まれます。


ところが、「マージファイル」や「DEP ファイル」(あるいはそれに相当する情報)が
得られない場合には、セットアッププロジェクトは、対象となる VBプロジェクトが
MSCOMM32.OCX を使っている事までは分かっても、MSCOMM32.OCX の依存情報までは
判断できないため、依存ファイルである MSCOMJP.DLL 等がインストーラに含まれず、
不完全なインストーラになってしまいます。

そして、その警告が
> > > 「次のファイルは自動的に判断できない依存関係を持っている可能性があります。
> > > プロジェクトにすべての依存関係が追加されていることを確認してください。」
であるというわけです。

# 特に自作 DLL を利用している場合には、その DLL が使用しているファイル群の
# 依存情報が(セットアップ プロジェクトには)わからない可能性が高いでしょうね。


> 使用しているDLLはVisual Basic6.0で作成された自作のものです。こちらはMSCOMM32.OCXを
> 利用しているのでそのままでは動作しないため、他のPCで動かすためにsystem32の中に
> MSCOMM32.OCXをコピーして動作させている状態です。

それは、聊か問題があるように思えます。

(1) VB6付属 MSCOMM32.OCX の単体配布は禁止されています(自作VB6アプリに付属させるのは OK)。
(2) OCX だけではなく、関連する依存ファイルも併せて配布しなければなりません。
(3) “DLL Hell”と呼ばれる状況を避けるため、コピー時のバージョンチェックも含めるべきです。
(4) OCX である以上、レジストリへの登録(またはマニフェストでの指定)が必要です。

できれば、手動コピーではなく、マージモジュールを用意した方が良いかと思います。

> 2005でなにか代用できるようなものがあれば新しく作成したいと考えています。
シリアルポートを通じて通信を行う必要がある場合には、VB2005 においては
System.IO.Ports.SerialPort クラスを利用する事ができます。

> 互換モードと言うのがよくわからないのですが、設定では「互換なし」となっていました。
> これはなにか変更しないといけないのでしょうか??
今後一切、その DLL を再コンパイルしないというのであれば、互換なしでも良いですが、
DLL の修正を行う可能性があるなら、「バイナリ互換」とする必要があります。


たとえば、ActiveX DLL にバグがあったとして、それを修正したとしますよね。
その時、DLL を更新したとしても、それを呼び出しているプログラムまで
再コンパイルしなければならないとしたら……面倒ですよね。

そこで通常は、「前のバージョンと互換性を持った DLL」を作るわけです。
そのため、配布用の DLL は『バイナリ互換』とするのが一般的かと。

そのかわりバイナリ互換にすると、メソッドの引数の数やデータ型を変更するとか、
不要になったプロパティを削除するなどの「互換性を損なう修正」はできません。

互換なし …… 初回コンパイル時は、これを選ぶしかない。
バイナリ互換 …… 配布用。最終的にはコレにする。
http://support.microsoft.com/kb/161137/ja


> ActiveX DLL の IID、CLSID、ProgIDをどうやって取得するのかわかりません。
VB6 の「互換なし」でコンパイルしている場合、IID や CLSID は、コンパイルするたびに
変更されてしまう可能性がありますが、「バイナリ互換」の場合は維持されるのです。

そして、VB6 製の ActiveX DLL の場合、CLSID 等の値は、VB コンパイラによって
自動的に決定されるため、基本的にはコンパイル後の DLL を調べることになります。
(.NET 製の ActiveX DLL の場合は、CLSID 等の値を、ソース中にて指定できますが)

なお、CLSID 等の調査には、Visual Studio に付属している OLEVIEW.EXE というツールが使えます。

[ツリー表示へ]
タイトルRe^6: VisualStudioの設定のリセットについて
記事No6837
投稿日: 2008/01/17(Thu) 11:07
投稿者たると
魔界の仮面弁士さんこんにちは、すべて解決するには時間がかかりそうなのでひとまず現状報告とお礼を言いたいのでメッセージを書き込ませていただきます。

> 警告されたファイルそのものではなく、そのファイルの依存情報が問題となります。
>
> たとえば、C:\WINDOWS\SYSTEM32\MSCOMM32.DEP をメモ帳で開いてみてください。
>
> COMDLG32.DEP を見ると、『MSCOMM32.OCX』というファイルが、
> 「COMCAT.DLL」と「MSCOMJP.DLL」に依存している事がわかります。
>
> # 特に自作 DLL を利用している場合には、その DLL が使用しているファイル群の
> # 依存情報が(セットアップ プロジェクトには)わからない可能性が高いでしょうね。

VB6.0ではDLLのファイルだけで動作していたため、今回も同じようにしていました。
依存関係のファイルがみつからなかったためエラーがでていたのですね。
ファイルの参照をしている場所に自作DLLのプログラムからXXX.DLLの作成をしたところ依存関係のあるファイルもきちんと作成されレジストリ関係のエラーがでなくなりました。

> > 2005でなにか代用できるようなものがあれば新しく作成したいと考えています。
> シリアルポートを通じて通信を行う必要がある場合には、VB2005 においては
> System.IO.Ports.SerialPort クラスを利用する事ができます。
>
> > 互換モードと言うのがよくわからないのですが、設定では「互換なし」となっていました。
> > これはなにか変更しないといけないのでしょうか??
> 今後一切、その DLL を再コンパイルしないというのであれば、互換なしでも良いですが、
> DLL の修正を行う可能性があるなら、「バイナリ互換」とする必要があります。
>
>
> たとえば、ActiveX DLL にバグがあったとして、それを修正したとしますよね。
> その時、DLL を更新したとしても、それを呼び出しているプログラムまで
> 再コンパイルしなければならないとしたら……面倒ですよね。
>
> そこで通常は、「前のバージョンと互換性を持った DLL」を作るわけです。
> そのため、配布用の DLL は『バイナリ互換』とするのが一般的かと。
>
> そのかわりバイナリ互換にすると、メソッドの引数の数やデータ型を変更するとか、
> 不要になったプロパティを削除するなどの「互換性を損なう修正」はできません。
>
> 互換なし …… 初回コンパイル時は、これを選ぶしかない。
> バイナリ互換 …… 配布用。最終的にはコレにする。
> http://support.microsoft.com/kb/161137/ja
>
>
> > ActiveX DLL の IID、CLSID、ProgIDをどうやって取得するのかわかりません。
> VB6 の「互換なし」でコンパイルしている場合、IID や CLSID は、コンパイルするたびに
> 変更されてしまう可能性がありますが、「バイナリ互換」の場合は維持されるのです。
>
> そして、VB6 製の ActiveX DLL の場合、CLSID 等の値は、VB コンパイラによって
> 自動的に決定されるため、基本的にはコンパイル後の DLL を調べることになります。
> (.NET 製の ActiveX DLL の場合は、CLSID 等の値を、ソース中にて指定できますが)
>
> なお、CLSID 等の調査には、Visual Studio に付属している OLEVIEW.EXE というツールが使えます。

これらについてはまだ勉強中です。なにか進展がありましたら、報告をさせていただきたいと思います。たくさんの質問に答えていただき、ありがとうございました。

[ツリー表示へ]