0

我希望有人可以帮助解决这个问题。我也希望这个问题有一个简单的答案。我觉得我遗漏了一些非常明显的东西,但我是 C++ 新手,无法解决这个问题。

我想将 IUpdateCollection 传递给函数,将 IUpdates 放入集合中,然后能够在函数之外访问集合。在下面的代码中,一切都编译/运行,但是在 Searcher 函数内部时 IUpdateCollection 中的项目计数为 5,但是当我稍后尝试从函数外部计算 IUpdateCollection 中的项目时,计数为 0。

我在这里想念什么?

谢谢!

class W
{
public:
    // constructor
    W()
    {       
        //create the COM object to return the IUpdateSession interface pointer
        hr = CoCreateInstance( )
    }

    int Searcher(IUpdateCollection* pUpdateCollection)
    {                           

        //put the updates into our pUpdateCollection
        hr = pSearchResult->get_Updates(&pUpdateCollection);
        if(FAILED(hr) || pUpdateCollection == NULL)
        { cout << "Failed to put updates in the collection"; return -103; };

        long lUpdatesCount = NULL;
        hr = pUpdateCollection->get_Count(&lUpdatesCount);
        if(FAILED(hr) || pSearchResult == NULL)
        { cout << "Failed to get count of udpates in collection"; return -104; };

        cout << lUpdatesCount << endl;  //console outputs the actual count here, which at the moment is 5

        pUpdateSearcher->Release();     
        return 0;
    }
private:
    HRESULT hr;
    IUpdateSession* pUpdateSession; 
};

int main(int argc, char* argv[])
{
    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

    HRESULT hr;


    W myW;
    //pass the pUpdateCollection to the W.Searcher function
    myW.Searcher(pUpdateCollection);

    //get count of updates in collection
    long lUpdatesCount = NULL;
    pUpdateCollection->get_Count(&lUpdatesCount);

    cout << lUpdatesCount << endl;  //console outputs 0 here instead of the same count that it outputted in W.Searcher().  WHY?
    CoUninit();

    system("pause");
    return 0;
}
4

2 回答 2

1

使用 和 之类的智能_com_ptr_t指针_bstr_t。使用原始指针并直接操作 BSTR 无非是痛苦。

#import- 使用 COM DLL 将为您创建类型化的智能指针,包括易于使用的 CreateInstance 方法。智能指针还消除了在每次调用后显式检查 HR 的需要,它们会引发异常。

至于您的问题:这取决于您的 COM 对象的实现/规范/文档。也许发布IUpdateSearcher清除计数,但这只是我的猜测。相关代码将是 COM 服务器,而不是客户端。

没有注意到这是 WUA,记录了行为

ISearchResult::Updates 分配IUpdateCollection。因此,您传入指针的值,在函数范围内更改它,然后期望更改应用于范围之外。你正在做同样的事情,但使用 int:

void f(int a)
{
  a=5;
}

void main()
{
  int a = 7;
  f(a);
  printf("%d", a); -- of course is 7, not 5
}

int您可以通过传递 ref 或指针来解决“问题” 。这同样适用于您的 COM 指针。并且使用 _com_ptr_t 会清楚地表明问题:)

于 2012-07-17T21:23:35.443 回答
1

Updates 属性返回一个 IUpdateCollection 指针,它将 pUpdateCollection 参数的内容覆盖到您的 Searcher() 方法中。您在 Searcher 中检查的计数是该集合的计数。

但是您按值传递了 pUpdateCollection,因此当您退出 Searcher 时,由 get_Updates() 检索到的 IUpdateCollection 将被丢弃。

要查看这一点,请在您的 get_Updates() 调用上放置一个断点,并在您跨过 get_Updates 调用时观察 pUpdateCollection 的值的变化。然后退出 Searcher 并注意 main 的 pUpdateCollection 中的值没有改变。

于 2012-07-17T21:41:05.693 回答