描述:
用向导创建ATL的工程后,在添加了new ATL Object,接口的定义为custom。
因为要导出多个接口,就在idl里添加了定义,代码如下
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(F11D0AA2-FFA5-11D7-8E9A-00E04C69B973),
helpstring("IBvtDriver Interface"),
pointer_default(unique)
]
interface IBvtDriver : IUnknown
{
};
[
object,
uuid(3B025F97-D001-45F3-A6A6-C944F64FB6E2),
helpstring("IBvtVgaPreview Interface"),
pointer_default(unique)
]
interface IBvtVgaPreview : IUnknown
{
};
[
uuid(F11D0AA1-FFA5-11D7-8E9A-00E04C69B973),
// uuid(68AF1D58-06E7-4429-B934-E46F48A89B27),
version(1.0),
helpstring("MaterialPlayCom 1.0 Type Library")
]
library MATERIALPLAYCOMLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
[
uuid(F11D0AA4-FFA5-11D7-8E9A-00E04C69B973),
helpstring("MaterialPlay Class")
]
coclass MaterialPlay
{
[default] interface IBvtDriver;
interface IBvtVgaPreview;
};
};
然后在接口映射表里添加,代码如下,
class ATL_NO_VTABLE CMaterialPlay :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMaterialPlay, &CLSID_MaterialPlay>,
public IBvtDriver,
public IBvtVgaPreview
{
public:
CMaterialPlay()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_MATERIALPLAY)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CMaterialPlay)
COM_INTERFACE_ENTRY(IBvtDriver)
COM_INTERFACE_ENTRY(IBvtVgaPreview)
END_COM_MAP()
};
编译通过,也注册了。但是发现注册表里只有对象的注册IID,而接口的IID却没有,请问有什么原因。
后来我用向导生成了一个custom单接口的对象,注册后发现也只有对象的IID,没有接口的IID,难道组件里的interface不注册?
请指教,谢谢。
解决方案1:
mark
解决方案2: Custom接口就是从IUnknown接口派生的类,显然它就只能用虚函数表的方式来调用接口了,他不继承自IDispatch接口,自然不需要IID。
不可能,那是你没有找到不是说没有!你写个demo调用一些你的组件就知道了!
解决方案4:你的几个uuid的值都一样啊!所以……