我有一个带IDL接口的Dll项目。 我希望在我的dll中有接口,其中一个可以从其他接口派生。 我用ATL简单对象向导创建了两个接口。
[
object,
uuid(7359AF6C-6E90-4372-991F-556602CB3977),
dual,
nonextensible,
pointer_default(unique)
]
interface IZInterface : IDispatch{
[id(1)] HRESULT ZGetStr([out,retval] BSTR* str);
[id(2)] HRESULT GetSize([in,out] LONG* nSize);
};
[
object,
uuid(8CA6DBF2-E402-464D-96AE-3D6642D91E14),
pointer_default(unique)
]
interface IBClass : IUnknown{
[] HRESULT Method11([out,retval] LONG* l);
};
library DllStandardLib
{
importlib("stdole2.tlb");
[
uuid(491DF659-012F-4C20-90AA-0CBC5BDE5A68)
]
coclass ZInterface
{
[default] interface IZInterface;
};
[
uuid(43CE897F-17F2-4D45-9098-26B7AEE6EC23)
]
coclass BClass
{
[default] interface IBClass;
};
};
现在,我右键单击Class View中的CZInterface,然后单击Impelement Interface IBClass。
但是在作为C#项目的continer中:
DllStandardLib.ZInterface dd = new DllStandardLib.ZInterface();
dd.Method11();//---> Error: DllStandardLib.ZInterface' does not contain a definition for 'Method11' and no extension method 'Method11' accepting a first argument of type ...
我的项目有什么问题?我希望第二个(派生)接口知道基本接口的所有方法和属性。 请帮我!
答案 0 :(得分:1)
如果你想要实现这一目标,最好不要使用对象向导。首先,定义您的接口:
[
object,
uuid(7359AF6C-6E90-4372-991F-556602CB3977),
dual,
nonextensible,
pointer_default(unique)
]
interface IZInterface : IDispatch
{
[id(1)] HRESULT ZGetStr([out,retval] BSTR* str);
[id(2)] HRESULT GetSize([in,out] LONG* nSize);
};
[
object,
uuid(8CA6DBF2-E402-464D-96AE-3D6642D91E14),
pointer_default(unique)
]
interface IBClass : IZInterface // IBClass inherits from IZInterface
{
[id(3)] HRESULT Method11([out,retval] LONG* l);
};
然后定义实现专用接口的类。在您的图书馆内执行此操作:
library DllStandardLib
{
importlib("stdole2.tlb");
[
uuid(43CE897F-17F2-4D45-9098-26B7AEE6EC23)
]
coclass BClass
{
[default] interface IBClass;
};
// NOTE: No need for ZInterface coclass.
};
请注意,实际上并不需要IZInterface
类,除非您想提供单独的实现(=另一个类)。
为了使QueryInterface
- 调用起作用,您还应该将接口添加到COM接口映射中:
class CBClass :
// ...
{
// ...
BEGIN_COM_MAP(CBClass)
COM_INTERFACE_ENTRY(IBClass)
COM_INTERFACE_ENTRY(IZInterface)
END_COM_MAP()
// ...
// IBClass-Member
STDMETHOD(Method11)(LONG* l); // Implement this in your source file (STDMETHODIMP CBClass::Method11(LONG* l) { return E_NOTIMPL; }
}
要从.NET调用IBClass
接口成员,您必须创建正确类的实例:
DllStandardLib.BClass bc = new DllStandardLib.BClass();
bc.Method11();