我的第一个COM导入

本文关键字:导入 COM 第一个 我的 | 更新日期: 2023-09-27 18:05:53

我有一个.h文件,声明如下:

////////////////////////////////////////////////////////////////////////////////
// Syntek Plug-In Custom Control GUIDs.                                       //
////////////////////////////////////////////////////////////////////////////////
// {59DF6360-6F14-4472-82B6-6EAB971EEFAD}
DEFINE_GUID(CLSID_IStkCustomControl,
            0x59DF6360, 0x6F14, 0x4472, 0x82, 0xB6, 0x6E, 0xAB, 0x97, 0x1E, 0xEF, 0xAD);
// {59DF6361-6F14-4472-82B6-6EAB971EEFAD}
DEFINE_GUID(CLSID_IStkCustomControl_PropertyPage,
            0x59DF6361, 0x6F14, 0x4472, 0x82, 0xB6, 0x6E, 0xAB, 0x97, 0x1E, 0xEF, 0xAD);
// Custom Control Interfaces.
MIDL_INTERFACE("59DF6360-6F14-4472-82B6-6EAB971EEFAD")
IStkCustomControl : public IUnknown
{
public:
    virtual HRESULT STDMETHODCALLTYPE Get(PKSPROPERTY_STK_CUSTOM_CONTROL_S pStkCustomControl) = 0;
    virtual HRESULT STDMETHODCALLTYPE Set(PKSPROPERTY_STK_CUSTOM_CONTROL_S pStkCustomControl) = 0;
};

我想将接口IStkCustomControl移植到c#。到目前为止,我有这样的c#代码:

Guid guid = new Guid(0x59df6360, 0x6f14, 0x4472, 0x82, 0xb6, 0x6e, 0xab, 0x97, 0x1e, 0xef, 0xad);
Type type = Type.GetTypeFromCLSID(guid); // line 2 
object obj = Activator.CreateInstance(type);

当执行第2行时,我得到异常

用CLSID创建COM组件的实例{59DF6360-6F14-4472-82B6-6EAB971EEFAD}从IClassFactory获取失败80040202.

怎么了?

更新:我发现IStkCustomControl接口是在一个名为StkProp.ax的文件中实现的。我试着运行AxImp.exe StkProp.ax,但这给了我

AxImp Error:加载类型库/DLL错误。(Exception from HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY))

我的第一个COM导入

通常情况下,info类型嵌入在实现该对象的DLL中。使用OLEView来确保。如果是这样,那么设置对该DLL的COM引用并使用自动包装器。

把info类型作为独立的TLB文件是九十年代末的事了