3

Windows 8 Metro (WinRT) に移植する必要がある C/C++ SDK ライブラリがあります。ライブラリはほとんど OS に依存しませんが、OS 提供の API を使用してハードウェアとやり取りするモジュールがいくつか含まれています。

これを WinRT に移植する際に、可能な限り C++/CX の代わりに WRL を使用することにしました。これで、必要な WinRT オブジェクトのほとんどを作成して使用できるようになりました。しかし、WinRT によって提供される Async オブジェクトを操作しているときに、絶対的な障害に直面しました。

たとえば、次のコードを使用して HW デバイスを列挙します。

// create interface to "static" members of DeviceInformation class
ComPtr<IDeviceInformationStatics>   DeviceInformationStatics;
HRESULT hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Devices_Enumeration_DeviceInformation).Get(), &DeviceInformationStatics);

ComPtr<IAsyncOperation<DeviceInformationCollection*>> operation;
hr = DeviceInformationStatics->FindAllAsyncDeviceClass( DeviceClass_All, &operation);

この時点で、有効な IAsyncOperation ポインターがあります。私はそれが次のように使用できると思いました:

task<ComPtr<DeviceInformationCollection*>> tsk(operation);

しかし、IAsyncOperation を受け入れる task<> コンストラクターが ppltasks.h の "#if defined(__cplusplus_winrt)" の下で宣言されているため、失敗しました。これは、/ZW コンパイラー オプションに依存します。

この場合、IAsyncOperation オブジェクトをどのように使用すればよいですか? 実際には、操作が完了するのを待つだけです。

4

5 に答える 5

4

他の誰かが C++/WinRT でこれを探している場合に備えて:

    auto asyncOp = someFunctionReturningIAsyncOperation();

    asyncOp.Completed([](auto &&result, auto && status) {
        // do whatever with result and status
    });
于 2018-08-30T07:05:09.483 に答える
1

私の C++/CX の経験から、できることは、AsyncOperationCompletedHandler<DeviceInformationCollection*>オブジェクトを作成し、それをクラスのメンバー関数で初期化しCompleted、IAsyncOperation のプロパティに割り当てることです。

C++/CX では、 2 つのパラメーター (呼び出し元のクラスからのパラメーターと、メンバーへのポインターからコールバック メソッドへのポインター) を使用してAsyncOperationCompletedHandler<>オブジェクトを作成するだけです。thisこのような:

MyAsyncOp->Completed = ref new AsyncOperationCompletedHandler<ResultType ^>(this, &MyClass::OnDone);

ここで、OnDone は次のように定義されます。

void MyClass::OnDone(IAsyncOperation<ResultType ^> ^AsOp, AsyncStatus s)
{
     ResultType ^Result = AsOp->GetResults();
}

WRL でコンストラクターを呼び出す方法がわかりません。あなたはこれを理解します。

また、完了ハンドラはランダム スレッドで呼び出されます。何かを UI スレッドに戻す必要がある場合Dispatcher->RunAsync()は、友人です。ほとんどの XAML クラスには Dispatcher メンバーが含まれています。

Callback編集:サンプルを見ていると、 a とポインターへのポインターの周りに構築する、という名前の非管理ヘルパー クラスがあるようですthis。調べる。ただし、IAsyncOperationに接続する方法はまだわかりません...

于 2012-07-10T17:37:19.450 に答える
0

ライブラリハードウェア固有のモジュールがすでにWin32で動作している場合は、そのままにしておくことをお勧めします。Win32サービスをインストールしてハードウェアと対話すると、Metroアプリはサービスと通信するだけで済みます(ソケット、パイプなどの多くのIPCオプション、制限されたMetroサンドボックスでもうまく機能するものを見つけることができると確信しています)。

于 2012-07-10T17:20:03.783 に答える
-1

IAsyncOperation は待機可能な型であるため、await と同等のものを使用するか、その Result プロパティを呼び出す必要があります。

于 2013-03-20T21:27:16.480 に答える