【问题标题】:Dealing with IDispatch parameter and COM处理 IDispatch 参数和 COM
【发布时间】:2014-04-12 13:17:36
【问题描述】:

我有一个函数通过参数(项目)返回指向接口指针的指针:

CreateProject(std::string str, IDispatch** project);

鉴于其他两个实现 IDispatch 的接口:A 和 B,鉴于项目的真实类型是 A,以下代码是否合法。(我正在尝试使用 COM VCProjectEngine.CreateProject)

A** a;
B** b;

CreateProject("test.vcxproj", a); //should work but I don't know why
CreateProject("test.vcxproj", b); //should not work but I don't know why

有人可以解释一下这种事情是如何工作的吗?对不起,我对 COM 对象有点陌生。

【问题讨论】:

    标签: c++ pointers interface com


    【解决方案1】:

    IDispatch** project 参数通常假定您传递一个指向IDispatch* 变量的指针,该变量将被实际的接口指针填充:

    IDispatch* pDispatch;
    pDispatch = NULL; // Sanity, optional
    CreateProject("test.vcxproj", &pDispatch);
    assert(pDispatch != NULL); // Filled by call above
    // ...
    pDispatch->Release();
    

    由于处理 COM 接口指针让您关心正确的引用计数,因此您通常希望使用包装类,而不是原始指针:

    CComPtr<IDispatch> pDispatch;
    CreateProject("test.vcxproj", &pDispatch);
    ATLASSERT(pDispatch != NULL);
    

    阅读 MSDN 上的 CComPtr

    【讨论】:

    • 拥有一个指向 IDispatch 接口的指针并不是很有用,为什么我想做的是创建一个项目或用这个加载一个项目:VCProjectEngine::LoadProject (msdn.microsoft.com/en-us/library/…) 然后访问 VCProject 方法。所以这就是为什么我认为将一个 VCProject(继承自 IDispatch)作为参数会起作用的原因。
    • 您的评论偏离了问题——不清楚您想要什么。你问 IDispatch,现在你不想要它了。
    • Using VCProjectEngine and COM - 这是同一个问题吗?
    • 我不想要 IDispatch 接口,我想要 VCProject 一个(能够将文件添加到项目中)但是 VCProjectEngine 的创建和加载方法只需要一个 IDispatch 参数
    • 是的,有点像,不清楚的我会关闭这个。
    猜你喜欢
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 2023-01-18
    相关资源
    最近更新 更多