關於三個接口的具體描述,可以參考《C#高級編程第三版》28.1.3 接口。
在MSDN上查找,可以知道IObjectSafety繼承自IUnknown,是一個定制接口;通過上一章節,可以發現 向COM注冊時,需要提供一個Guid作為CLSID來標識程序集中的C#類,事實上在COM中,接口和類型庫都是 帶有Guid作為唯一標識的,分別為IID和typelib id。
這樣,通過在C#編寫的接口標上需要的COM接口IID,就可以在注冊是向COM表明接口身份了。在 Microsoft幫助上查找IObjectSafety定義:
[
uuid(C67830E0-D11D-11cf-BD80-00AA00575603),
helpstring("VB IObjectSafety Interface"),
version(1.0)
]
library IObjectSafetyTLB
{
importlib("stdole2.tlb");
[
uuid(CB5BDC81-93C1-11cf-8F20-00805F2CD064),
helpstring("IObjectSafety Interface"),
odl
]
interface IObjectSafety:IUnknown {
[helpstring("GetInterfaceSafetyOptions")]
HRESULT GetInterfaceSafetyOptions(
[in] long riid,
[in] long *pdwSupportedOptions,
[in] long *pdwEnabledOptions);
[helpstring("SetInterfaceSafetyOptions")]
HRESULT SetInterfaceSafetyOptions(
[in] long riid,
[in] long dwOptionsSetMask,
[in] long dwEnabledOptions);
}
}
其中的uuid(CB5BDC81-93C1-11cf-8F20-00805F2CD064)就是需要的接口IID。
使用C#編寫IObjectSafety:
using System;
using System.Runtime.InteropServices;
namespace KeyActiveX
{
[ComImport, Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IObjectSafety
{
[PreserveSig]
void GetInterfacceSafyOptions(
int riid,
out int pdwSupportedOptions,
out int pdwEnabledOptions);
[PreserveSig]
void SetInterfaceSafetyOptions(
int riid,
int dwOptionsSetMask,
int dwEnabledOptions);
}
}