- PR -

.NETクラスライブラリのCOM登録について

1
投稿者投稿内容
Orion
常連さん
会議室デビュー日: 2005/07/11
投稿数: 27
お住まい・勤務地: 京都府・京都市
投稿日時: 2005-07-11 09:43
はじめまして。Orionと申します。
先々週からVisualStudio.NET2003でアプリケーションを開発することになった初心者です。

C#で作成したクラスライブラリのCOM化について質問です。

// Guid for the interface IGenerateUnmanagedCOM.
[Guid("E9678B50-97C7-49e5-AC65-A8AD588411E9")]
interface IGenerateUnmanagedCOM
{
void Generate(out object objCOM);
}

/// <summary>
/// CGenerateUnmanagedCOM の概要の説明です。
/// </summary>
// Applies the ClassInterfaceAttribute to set the interface to dual.
[GuidAttribute("69296A00-8954-449b-AAE2-152C33F2E241")]
[ClassInterface(ClassInterfaceType.AutoDispatch)]
public class CGenerateUnmanagedCOM : IGenerateUnmanagedCOM
{
public CGenerateUnmanagedCOM()
{
}

public void Generate(out object objCOM)
{
}
}

上記の様なコードを作成してビルド後タイプライブラリのExportを行ったのですが、

extern "C" const GUID __declspec(selectany) LIBID_GenVC6COM =
{0xf2f953a5,0xb2f9,0x3c78,{0xaf,0x5c,0xdd,0x9b,0x26,0x7b,0xc7,0x82}};
extern "C" const GUID __declspec(selectany) CLSID_CGenerateUnmanagedCOM =
{0x69296a00,0x8954,0x449b,{0xaa,0xe2,0x15,0x2c,0x33,0xf2,0xe2,0x41}};
extern "C" const GUID __declspec(selectany) IID__CGenerateUnmanagedCOM =
{0xe01b0cb4,0x4a01,0x3930,{0x8f,0xc4,0x96,0x1b,0x47,0x44,0x7e,0xd4}};

C#クラスのGUIDは定義した値になるのですが、IIDがinterfaceで定義しているIIDになりません。(任意の値が割り当てられているようです)
C#で定義したIIDがないとCoCreateInstanceでオブジェクトが生成できない気がするのですが、どうなのでしょうか。
また、任意のIIDを生成されると、PCによって値が変わる気もします。


渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-07-11 10:30
引用:

C#クラスのGUIDは定義した値になるのですが、IIDがinterfaceで定義しているIIDになりません。(任意の値が割り当てられているようです)



interface 定義が public になっていないようですよ。

引用:

C#で定義したIIDがないとCoCreateInstanceでオブジェクトが生成できない気がするのですが、どうなのでしょうか。



関係ありません。

IID が出力されていないのは問題ですが、それとオブジェクトの生成とはまったく関係がありません。

オブジェクトの生成に必須なのは CLSID です。

生成したオブジェクトに対して操作を行う際に IID が必要になります。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
Orion
常連さん
会議室デビュー日: 2005/07/11
投稿数: 27
お住まい・勤務地: 京都府・京都市
投稿日時: 2005-07-11 10:53
渋木様 早速の回答ありがとうございました。

> IID が出力されていないのは問題ですが、それとオブジェクトの生成とはまったく関> 係がありません。
>
> オブジェクトの生成に必須なのは CLSID です。
>
> 生成したオブジェクトに対して操作を行う際に IID が必要になります。
すみません。説明不足でした。
CLSID(ProgID)は分かっているのですが、CoCreateInstanceの4番目の引数IIDが
分からないと生成できない気がしたのです。

あれから色々調査して、IUnknownのみでアクセスすることにしました。
以下が改訂したコードです。

// Guid for the interface IGenerateUnmanagedCOM.
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("E9678B50-97C7-49e5-AC65-A8AD588411E9")]
public interface IGenerateUnmanagedCOM
{
void Generate(out object objCOM);
}

/// <summary>
/// CGenerateUnmanagedCOM の概要の説明です。
/// </summary>
// Applies the ClassInterfaceAttribute to set the interface to dual.
[GuidAttribute("69296A00-8954-449b-AAE2-152C33F2E241")]
[ClassInterface(ClassInterfaceType.None)]
public class CGenerateUnmanagedCOM : IGenerateUnmanagedCOM
{
public CGenerateUnmanagedCOM()
{
}

public void Generate(out object objCOM)
{
}
}

public属性でIIDがExportされました。
本当にどうもありがとうございました。助かりました。
今後ともどうぞ宜しくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)