4

WinFormユーザーコントロールをCOMサーバーとして登録して、MFCアプリケーションで使用できるようにしようとしています。winformコントロールはC++/ CLIで記述されており、管理されていないネイティブdllを使用します。.netのすばらしい相互運用サービスを利用して、このユーザーコントロールをCOMサーバーとして登録したいと思います。

[ProgId("MyAx.MyAxControl")]    
[ClassInterface(ClassInterfaceType::AutoDual)]
[Guid("612EAF58-ADCC-4e87-BC9E-FA208B037414")]
public ref class MyAxControl: public System::Windows::Forms::UserControl

MSDNは、自分がしていることを達成するためにregasmを使用できると言ったので、先に進んで登録しました

regasm MyAx.dll /tlb:MyAx.tlb

レジストリエントリも生成しました

regasm MyAx.dll /regfile:MyAx.reg

そしてそれを私のレジストリとマージしました

この時点で、ツールボックスの[アイテム]を選択すると、このコントロールがCOMコンポーネントに表示されることを期待していました。しかし、それはそこに現れていません。これは予想される動作ですか?はいの場合、ActiveXコントロール(Javaなど)を使用する言語については、MFCアプリケーションでこのコントロールをどのように使用しますか。

4

1 に答える 1

1

欠落しているのは、COMオブジェクトがコントロールであることをシステムに伝えることです。不足している情報は、レジストリの「ImplementedCategories」エントリです。COMへの登録時にこの情報を提供するには、カスタムCOM(非)登録関数を作成する必要があります。

private const string ControlsCategoryId = "{40FC6ED4-2438-11CF-A3DB-080036F12502}";

[ComRegisterFunction]
internal static void ComRegister(string key)
{
    key = key.Replace("HKEY_CLASSES_ROOT\\", "");
    RegistryKey reg = Registry.ClassesRoot.CreateSubKey(key);
    reg.SetValue("", "Your.ProgId.Here");
    reg = reg.CreateSubKey("Implemented Categories");
    reg.CreateSubKey(ControlsCategoryId);
}

[ComUnregisterFunction]
internal static void ComUnregisterFunction(string key)
{
    key = key.Replace("HKEY_CLASSES_ROOT\\", "");
    RegistryKey reg = Registry.ClassesRoot.OpenSubKey(key, true);
    reg = reg.OpenSubKey("Implemented Categories", true);
    reg.DeleteSubKey(ControlsCategoryId);
}

Com(un)registrationルーチンは静的で、voidを返し、単一の文字列またはType引数を受け入れ、適切な属性を持っている必要があります。現在、MSDNは、Type引数のみが受け入れられると主張していますが、互換性の理由から、文字列バージョン(バージョン1.1以降)も機能しています。この関数に渡される文字列は、レジストリキーHKCR \CLSID{YOUR-CLASS_GUID}です。

お役に立てば幸いです。

于 2009-11-03T22:50:28.810 に答える