DOBON.NET DOBON.NETプログラミング掲示板過去ログ

VS2005のVB.NETで作成したCOMが、どのようにすれば、VS6.0のVBで使えるんでしょう。

環境/言語:[OS : Windows XP Professional / 言語 : Visual Basic .NET / .NET Framework : 2.0]
分類:[.NET]

【解決したい問題】

VS2005のVB.NETで作成したCOMが、どのようにすれば、VS6.0のVBで使えるんでしょう。
説明:
VB.NET作成する時の手順(コンピュータA)
1.「新しいプロジェクト」⇒「クラスライブラリ」で新規にN204Comプロジェクトを生成しました。
2.Class1をComTestに変更し、下記のように一つ関数を追加しました。
Public Class ComTest
Public Function GetArg(Optional ByVal iArg As Integer = 0) As Integer
Return iArg
End Function
End Class
3.ComTestファイルのプロパティ画面を開き、「コンパイラ」タグ中の
  「COM 相互運用機能の登録」オプションをオンにしました。
4.ソリューションのビルドをして、N204Com.DLLとN204Com.tlbが生成されました。
===================================
VB6.0で作成する手順(コンピュータB)
1.コンピュータAで作成したN204Com.DLLとN204Com.tlbをフォルダComTestにコピーしました。
2.VB6.0でテスト用フォームにButten1を追加しました。
3.参照設定で「参照」ボタンを押して、ComTest\N204Com.tlbを選択しました。
4.ボタンのクリックイベントに下記のようにコード追加しました。
Private Sub Command1_Click()
Dim comT As New N204Com.ComTest
MsgBox comT.GetArg(1)
End Sub
5.実行(CTRL+F5)すると、「ActiveXコンポーネントはオブジェクトを作成できません。」というエラーがでました。
■No20555に返信(TONGさんの記事)
> 【解決したい問題】
>
> VS2005のVB.NETで作成したCOMが、どのようにすれば、VS6.0のVBで使えるんでしょう。
> 説明:
> VB.NET作成する時の手順(コンピュータA)
> 1.「新しいプロジェクト」⇒「クラスライブラリ」で新規にN204Comプロジェクトを生成しました。

● まずここが間違いです。
  COMクラスを選択して生成して下さい。通常のクラスでは、COM GUID が
  添付されないので、正しいCOMクラスにはなりません。

  例えば・・・
<ComClass(hogehogeCom.ClassId, hogehogeCom.InterfaceId, hogehogeCom.EventsId)> _
Public Class hogehogeCom

#Region "COM GUID"
' これらの GUID は、このクラスおよびその COM インターフェイスの COM ID を
' 指定します。この値を変更すると、
' 既存のクライアントはクラスにアクセスできなくなります。
Public Const ClassId As String = "12345678-1234-1234-1234-123456789012"
Public Const InterfaceId As String = "12345678-1234-1234-1234-123456789012"
Public Const EventsId As String = "12345678-1234-1234-1234-123456789012"
#End Region

  こんなコードが先頭に書かれます。

> 2.Class1をComTestに変更し、下記のように一つ関数を追加しました。
> Public Class ComTest
> Public Function GetArg(Optional ByVal iArg As Integer = 0) As Integer
> Return iArg
> End Function
> End Class
> 3.ComTestファイルのプロパティ画面を開き、「コンパイラ」タグ中の
>   「COM 相互運用機能の登録」オプションをオンにしました。
> 4.ソリューションのビルドをして、N204Com.DLLとN204Com.tlbが生成されました。
> ===================================
> VB6.0で作成する手順(コンピュータB)
> 1.コンピュータAで作成したN204Com.DLLとN204Com.tlbをフォルダComTestにコピーしました。
> 2.VB6.0でテスト用フォームにButten1を追加しました。
> 3.参照設定で「参照」ボタンを押して、ComTest\N204Com.tlbを選択しました。
> 4.ボタンのクリックイベントに下記のようにコード追加しました。
> Private Sub Command1_Click()
> Dim comT As New N204Com.ComTest
> MsgBox comT.GetArg(1)
> End Sub
> 5.実行(CTRL+F5)すると、「ActiveXコンポーネントはオブジェクトを作成できません。」というエラーがでました。

  後の手順はそれでもよいと思いますが、私はそのCOMウラスをセットアップ
  プロジェクトを作ってインストールするようにしています。
  要は、COMをレジストラする動作を自動で行わせる・・・と言うことです。
  RegAsm使って登録もできますので、その辺はお調べ下さい。

以上。
■No20557に返信(オショウさんの記事)
> ■No20555に返信(TONGさんの記事)
>>【解決したい問題】
>>
>>VS2005のVB.NETで作成したCOMが、どのようにすれば、VS6.0のVBで使えるんでしょう。
>>説明:
>>VB.NET作成する時の手順(コンピュータA)
>>1.「新しいプロジェクト」⇒「クラスライブラリ」で新規にN204Comプロジェクトを生成しました。
>
> ● まずここが間違いです。
>   COMクラスを選択して生成して下さい。通常のクラスでは、COM GUID が
>   添付されないので、正しいCOMクラスにはなりません。
>
>   例えば・・・
> <ComClass(hogehogeCom.ClassId, hogehogeCom.InterfaceId, hogehogeCom.EventsId)> _
> Public Class hogehogeCom
>
> #Region "COM GUID"
> ' これらの GUID は、このクラスおよびその COM インターフェイスの COM ID を
> ' 指定します。この値を変更すると、
> ' 既存のクライアントはクラスにアクセスできなくなります。
> Public Const ClassId As String = "12345678-1234-1234-1234-123456789012"
> Public Const InterfaceId As String = "12345678-1234-1234-1234-123456789012"
> Public Const EventsId As String = "12345678-1234-1234-1234-123456789012"
> #End Region
>
>   こんなコードが先頭に書かれます。
>
>>2.Class1をComTestに変更し、下記のように一つ関数を追加しました。
>>Public Class ComTest
>> Public Function GetArg(Optional ByVal iArg As Integer = 0) As Integer
>> Return iArg
>> End Function
>>End Class
>>3.ComTestファイルのプロパティ画面を開き、「コンパイラ」タグ中の
>>  「COM 相互運用機能の登録」オプションをオンにしました。
>>4.ソリューションのビルドをして、N204Com.DLLとN204Com.tlbが生成されました。
>>===================================
>>VB6.0で作成する手順(コンピュータB)
>>1.コンピュータAで作成したN204Com.DLLとN204Com.tlbをフォルダComTestにコピーしました。
>>2.VB6.0でテスト用フォームにButten1を追加しました。
>>3.参照設定で「参照」ボタンを押して、ComTest\N204Com.tlbを選択しました。
>>4.ボタンのクリックイベントに下記のようにコード追加しました。
>>Private Sub Command1_Click()
>> Dim comT As New N204Com.ComTest
>> MsgBox comT.GetArg(1)
>>End Sub
>>5.実行(CTRL+F5)すると、「ActiveXコンポーネントはオブジェクトを作成できません。」というエラーがでました。
>
>   後の手順はそれでもよいと思いますが、私はそのCOMウラスをセットアップ
>   プロジェクトを作ってインストールするようにしています。
>   要は、COMをレジストラする動作を自動で行わせる・・・と言うことです。
>   RegAsm使って登録もできますので、その辺はお調べ下さい。
>
> 以上。

ご返事有難うございます。
実際、この質問をする前にCOM側の最初のやり方はご指摘の通りでやりました。
ご返事に書いていないと思いますが、下記のコードも自動的生成されていました。
Public Sub New()
MyBase.New()
End Sub

コンピュータBで regsvr32 /i N204Com.dllを実行した後、「N204Com.dll was loaded, but the DllRegisterServer entry point was not found.
DllRegisterServer may not be exported, or a corrupt version of N204Com.dll may be in memory. Consider using PView to detect and remove it.」
というメッセージがでましたので、仕方なく、MSDNの参考に、上記のソースにしました。VB6.0の参照設定で、直接にN204Com.tlbを参照しました。

因みにコンピュータBの環境を説明します。
OS:Win2000 Professional SP4
.Net Framework: 2.0 はMSサイドでパッケージをインストールしました。
開発環境:VS6.0とVS2003

済みませんが、勉強不足で、
>「そのCOMウラスをセットアッププロジェクトを作ってインストールするようにしています」
という作成する参考資料はどこかにあるんでしょうか。是非、教えてお願いしたいですが・・・
又、RegAsmでやろうとしているところです。
■No20558に返信(TONGさんの記事)
> コンピュータBで regsvr32 /i N204Com.dllを実行した後、「N204Com.dll was loaded, but the DllRegisterServer entry point was not found.
> DllRegisterServer may not be exported, or a corrupt version of N204Com.dll may be in memory. Consider using PView to detect and remove it.」
> というメッセージがでましたので、仕方なく、MSDNの参考に、上記のソースにしました。VB6.0の参照設定で、直接にN204Com.tlbを参照しました。

.NET のCOMクラスのDLLは、RegSvr32ではレジストラできません。
 参照設定しても、レジストリに登録されていない為、動作しないのです。

> 因みにコンピュータBの環境を説明します。
> OS:Win2000 Professional SP4
> .Net Framework: 2.0 はMSサイドでパッケージをインストールしました。
> 開発環境:VS6.0とVS2003
>
> 済みませんが、勉強不足で、
> >「そのCOMウラスをセットアッププロジェクトを作ってインストールするようにしています」
> という作成する参考資料はどこかにあるんでしょうか。是非、教えてお願いしたいですが・・・

  .NET でのセットアッププロジェクトを作成するには、他にもいろいろ
  余計なことを勉強しないとできませんヨ!

  因みに、このサイトのTipsがある意味、一番勉強にはなりましたが。
  http://dobon.net/vb/dotnet/index.html#deployment

> 又、RegAsmでやろうとしているところです。

  RegAsmのヘルプみてもらえれば、解るはずですが・・・
  手動で登録するには、
  RegAsm "x:\xxx\yyy\HogeHogeCom.dll" "/tlb:x:\xxx\yyy\HogeHogeCom.tlb"

  フルパスで各々のファイル指定することを忘れずに!

以上。
■No20559に返信(オショウさんの記事)
> ■No20558に返信(TONGさんの記事)
>>コンピュータBで regsvr32 /i N204Com.dllを実行した後、「N204Com.dll was loaded, but the DllRegisterServer entry point was not found.
>>DllRegisterServer may not be exported, or a corrupt version of N204Com.dll may be in memory. Consider using PView to detect and remove it.」
>>というメッセージがでましたので、仕方なく、MSDNの参考に、上記のソースにしました。VB6.0の参照設定で、直接にN204Com.tlbを参照しました。
>
> .NET のCOMクラスのDLLは、RegSvr32ではレジストラできません。
>  参照設定しても、レジストリに登録されていない為、動作しないのです。
>
>>因みにコンピュータBの環境を説明します。
>>OS:Win2000 Professional SP4
>>.Net Framework: 2.0 はMSサイドでパッケージをインストールしました。
>>開発環境:VS6.0とVS2003
>>
>>済みませんが、勉強不足で、
>>>「そのCOMウラスをセットアッププロジェクトを作ってインストールするようにしています」
>>という作成する参考資料はどこかにあるんでしょうか。是非、教えてお願いしたいですが・・・
>
>   .NET でのセットアッププロジェクトを作成するには、他にもいろいろ
>   余計なことを勉強しないとできませんヨ!
>
>   因みに、このサイトのTipsがある意味、一番勉強にはなりましたが。
>   http://dobon.net/vb/dotnet/index.html#deployment
>
>>又、RegAsmでやろうとしているところです。
>
>   RegAsmのヘルプみてもらえれば、解るはずですが・・・
>   手動で登録するには、
>   RegAsm "x:\xxx\yyy\HogeHogeCom.dll" "/tlb:x:\xxx\yyy\HogeHogeCom.tlb"
>
>   フルパスで各々のファイル指定することを忘れずに!
>
> 以上。

いろいろ教えて頂いて、有難うございました。
最初のCOM作成手順でよかったことが分かりました。
問題はCOM登録の所でしたので、
>   手動で登録するには、
>   RegAsm "x:\xxx\yyy\HogeHogeCom.dll" "/tlb:x:\xxx\yyy\HogeHogeCom.tlb"
の方法で、問題を解決しました。
私のコンピュータBには .NET Framework 2.0 SDKを実装しなかったので、
Regasm.exeが見つからなかったことに、遠回りにしてしまいました。

ここで、再度、ご教授に感謝します。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板