tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^5: VisualStudioの設定のリセットについて
投稿日: 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 というツールが使えます。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。