- - PR -
.NETクラスライブラリのCOM登録について
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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によって値が変わる気もします。 | ||||||||
|
投稿日時: 2005-07-11 10:30
interface 定義が public になっていないようですよ。
関係ありません。 IID が出力されていないのは問題ですが、それとオブジェクトの生成とはまったく関係がありません。 オブジェクトの生成に必須なのは CLSID です。 生成したオブジェクトに対して操作を行う際に IID が必要になります。 _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://hidori.jp/ // Microsoft MVP for Visual C# // // @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/ | ||||||||
|
投稿日時: 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