2011-08-18 52 views
4

我有以下声明.h文件:我的第一个COM进口

//////////////////////////////////////////////////////////////////////////////// 
// 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号线的时候,我得到的异常

Creating an instance of the COM component with CLSID {59DF6360-6F14-4472-82B6-6EAB971EEFAD} from the IClassFactory failed due to the following error: 80040202.

什么错吗?

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

AxImp Error: Error loading type library/DLL. (Exception from HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY))

+2

如果你没有一个很好的理由来编写自己的包装器,你应该创建一个自动包装器。通过在Visual Studio中导入COM引用或通过'tlbimp.exe'创建封装器 –

+0

同意;这只是我找不到任何包含IStkCustomControl(另一个谜团)的.tlb文件。 – user181813

+0

这是因为它不是从IDispatch派生的自动兼容接口。这使得使用它从一个托管的程序危险。你必须在C#代码中重新声明COM接口。 –

回答

1

不是,类型信息嵌入在实现该对象的DLL。使用OLEView来确保。如果是这样,那么建立一个COM引用到该DLL并使用自动包装器。

把类型信息作为独立的TLB文件已经九十年代末了。