1

私は、初めてのC++/WRLを使用して Windows 10 ストア/WinRT コードを書いています。そして、長い保留中の非同期操作をキャンセルする方法を知りたいですか?

それを説明する最良の方法は、次の例です。

#include <Windows.Services.Store.h>
#include <wrl.h>

auto onAppLicCompletedCallback = Callback<Implements<RuntimeClassFlags<ClassicCom>, IAsyncOperationCompletedHandler<StoreAppLicense*>, FtmBase>>(
    [](IAsyncOperation<StoreAppLicense*>* operation, AsyncStatus status)
{
    //Asynchronous operation is done
    return S_OK;
});

//'opAppLic' is defined as:
// ComPtr<IAsyncOperation<StoreAppLicense*>> opAppLic;
// ...

//Begin asynchronous operation
HRESULT hr = opAppLic->put_Completed(onAppLicCompletedCallback.Get());
if (SUCCEEDED(hr))
{
    //Keep going ...

    //Say, at some point here I need to cancel 'onAppLicCompletedCallback'
    //but how do I do it?
}

編集:opAppLic->Cancel()以下の回答で提案されているように追加しようとすると、次のコンパイラエラーが発生しました:

1>file-name.cpp(597): error C2039: 'Cancel' : is not a member of 'Microsoft::WRL::Details::RemoveIUnknownBase<T>'
1>          with
1>          [
1>              T=ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Services::Store::StoreAppLicense*>
1>          ]

代わりにそれが必要ですか、それとも何QueryInterfaceですか?IAsyncInfo

EDIT2:opAppLicこれは、変数のタイプについて取得しているものです:

ここに画像の説明を入力

いいえ、メソッドはありませんCancel:

ここに画像の説明を入力

4

2 に答える 2

1

IAsyncOperation<TResult>Cancel()から継承されたメソッドがありIAsyncInfoます。

Completedハンドラー自体をキャンセルすることはできません。非同期操作が完了すると発生します。代わりに操作をキャンセルする必要があり、Completedハンドラーは操作の最終ステータスを報告します。

#include <Windows.Services.Store.h>
#include <wrl.h>

auto onAppLicCompletedCallback = Callback<Implements<RuntimeClassFlags<ClassicCom>, IAsyncOperationCompletedHandler<StoreAppLicense*>, FtmBase>>(
    [](IAsyncOperation<StoreAppLicense*>* operation, AsyncStatus status)
{
    //Asynchronous operation is done
    if (status == completed)
    {
        // use results from operation->GetResults() as needed...
    }
    return S_OK;
});

ComPtr<IAsyncOperation<StoreAppLicense*>> opAppLic;
// Begin asynchronous operation that assigns opAppLic...

opAppLic->put_Completed(onAppLicCompletedCallback.Get());

//Keep going ...

//Say, at some point here I need to cancel the operation...
opAppLic->Cancel();
于 2016-10-23T16:06:21.430 に答える
1

誰でもこれに遭遇します。私はそれを手に入れたと思います。Remy Lebeauは部分的に正しかった。私がする必要があったのは、次のように取得することでしIAsyncInfoQueryInterface:

ComPtr<IAsyncInfo> pAsyncInfo;
if(SUCCEEDED(opAppLic->QueryInterface(__uuidof(pAsyncInfo), &pAsyncInfo)) &&
    pAsyncInfo)
{
    if(SUCCEEDED(pAsyncInfo->Cancel()))
    {
        //Async op was now canceled
        //Also note that `onAppLicCompletedCallback` will be called
        //with `status` set to `Canceled`
    }
}
于 2016-10-30T08:02:18.337 に答える