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
}

intrefまたはポインターを渡すことで、「問題」を解決できます。同じことがCOMポインターにも当てはまります。そして、 _com_ptr_t を使用すると、問題が明確に示されます:)

于 2012-07-17T21:23:35.443 に答える
1

Updates プロパティは、pUpdateCollection パラメータの内容を Searcher() メソッドに上書きする IUpdateCollection ポインタを返します。Searcher 内で調べているカウントは、そのコレクションのカウントです。

しかし、pUpdateCollection を値で渡したので、Searcher を終了すると、get_Updates() によって取得された IUpdateCollection は破棄されます。

これを確認するには、get_Updates() 呼び出しにブレークポイントを配置し、get_Updates 呼び出しをステップ オーバーするときに pUpdateCollection の値が変化するのを確認します。次に Searcher を終了し、main の pUpdateCollection の値が変更されていないことに注意してください。

于 2012-07-17T21:41:05.693 に答える