none
Winrt/c++ How to use Concurrency in MFC app RRS feed

  • Frage

  • I try to use this code in an MFC application:

    winrt::Windows::Storage::StorageFolder storageFolder{ winrt::Windows::Storage::ApplicationData::Current().LocalFolder() };
    		winrt::Windows::Foundation::IAsyncOperation<winrt::Windows::Storage::StorageFile> fileOp = storageFolder.GetFileAsync(L"C:\\Users\\Thomas\\Desktop\\test.bmp");
    
    		Concurrency::create_task(fileOp).then
    		([this](winrt::Windows::Storage::StorageFile* file)
    			{
    				winrt::Windows::Foundation::IAsyncOperation <winrt::Windows::Storage::Streams::IRandomAccessStream> readOp = file->OpenAsync(winrt::Windows::Storage::FileAccessMode::Read);
    
    }
    );

    When compiling, I get the error:

    error C2338:  incorrect parameter type for the callable object in 'then'; consider _ExpectedParameterType or task<_ExpectedParameterType> (see below)
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.22.27905\include\ppltasks.h(428): message :  Siehe Verweis auf die gerade kompilierte Klasse Vorlage-Instanziierung "Concurrency::details::_FunctionTypeTraits<_Function,_ReturnType>".

    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.22.27905\include\ppltasks.h(428): message :         with
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.22.27905\include\ppltasks.h(428): message :         [
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.22.27905\include\ppltasks.h(428): message :             _Function=COCRServer1Dlg::OnPaint::<lambda_2a8cdcb018f7002b3296ba8ca10921aa>,
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.22.27905\include\ppltasks.h(428): message :             _ReturnType=Concurrency::details::_BadArgType
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.22.27905\include\ppltasks.h(428): message :         ]

    In a UWP app I used the same, and there it works. 

    How can I use concurrency API in a native application?

    Thanks and regards,

    Thomas

    Donnerstag, 12. September 2019 15:28

Alle Antworten

  • Hallo,

    soweit mir bekannt, kannst Du auf WinRt nur mit einem Aufruf wie diesem zugreifen

    Windows::Foundation::ActivateInstance(HStringReference(RuntimeClass_Windows_Devices_WiFiDirect_WiFiDirectAdvertisementPublisher).Get(), &_publisher);

    Schau dir mal dieses Sample an Link


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    Donnerstag, 12. September 2019 22:42
  • I try to use this code in an MFC application:

    winrt::Windows::Storage::StorageFolder storageFolder{ winrt::Windows::Storage::ApplicationData::Current().LocalFolder() };
    		winrt::Windows::Foundation::IAsyncOperation<winrt::Windows::Storage::StorageFile> fileOp = storageFolder.GetFileAsync(L"C:\\Users\\Thomas\\Desktop\\test.bmp");
    
    		Concurrency::create_task(fileOp).then
    		([this](winrt::Windows::Storage::StorageFile* file)
    			{
    				winrt::Windows::Foundation::IAsyncOperation <winrt::Windows::Storage::Streams::IRandomAccessStream> readOp = file->OpenAsync(winrt::Windows::Storage::FileAccessMode::Read);
    
    }
    );

    When compiling, I get the error:

    error C2338:  incorrect parameter type for the callable object in 'then'; consider _ExpectedParameterType or task<_ExpectedParameterType> (see below)
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.22.27905\include\ppltasks.h(428): message :  Siehe Verweis auf die gerade kompilierte Klasse Vorlage-Instanziierung "Concurrency::details::_FunctionTypeTraits<_Function,_ReturnType>".

    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.22.27905\include\ppltasks.h(428): message :         with
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.22.27905\include\ppltasks.h(428): message :         [
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.22.27905\include\ppltasks.h(428): message :             _Function=COCRServer1Dlg::OnPaint::<lambda_2a8cdcb018f7002b3296ba8ca10921aa>,
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.22.27905\include\ppltasks.h(428): message :             _ReturnType=Concurrency::details::_BadArgType
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.22.27905\include\ppltasks.h(428): message :         ]

    In a UWP app I used the same, and there it works. 

    How can I use concurrency API in a native application?

    Thanks and regards,

    Thomas

    Freitag, 13. September 2019 08:14
  • Hallo Thomas,

    für das Multithreading haben wir uns, in MFC Anwendungen, bisher an die Vorgehensweise gehalten, die auch in der Dokumentation unter "Multithreading mit C++ und MFC" beschrieben wird.

    Bei Stackoverflow wird der Punkt MFC und WinRt diskutiert, im Beitrag "C++11 threads to update MFC application windows. SendMessage(), PostMessage() required?" - auf Basis dieser Diskussion gibt es ein GitHub Projekt "MFCAppWinRT".

    Zu GetFileAsync, gibt es hier noch ein Beispiel: https://stackoverflow.com/questions/20133759/c-cx-winrt-file-copy


    - Gruß Florian


    Freitag, 13. September 2019 08:17
  • Ich dachte eigentlich, das wäre der Sinn der Desktop Bridge.
    Freitag, 13. September 2019 08:57
  • Danke sehr. Allerdings sind die Beispiele recht alt. Ich dachte, mit Hilfe der Desktop Bridge sollte das alles viel einfacher gehen. Das eine Beispiel bezieht sich auch auf die Windows 8 Runtime. Die COM Objekte, die da in der Registry zu finden sind, gibt es bei mir nicht mehr. 

    Ingesamt ändern sich die Konzepte inzwischen derart schnell, dass man ohne Weiteres mal ein Tag vergeuden kann, indem man versucht, die falsche Doku anzuwenden.  

    Freitag, 13. September 2019 09:00
  • So, das hier compiliert und geht auch
    winrt::Windows::Foundation::IAsyncAction COCRServer1Dlg::openFile()
    {
    		//winrt::Windows::Storage::StorageFolder storageFolder{ winrt::Windows::Storage::ApplicationData::Current().LocalFolder() };
    		//winrt::Windows::Foundation::IAsyncOperation<winrt::Windows::Storage::StorageFile> fileOp = storageFolder.GetFileAsync(L"C:\\Users\\Thomas\\Desktop\\test.bmp");
    
    		auto file = co_await winrt::Windows::Storage::StorageFile::GetFileFromPathAsync(L"C:\\Users\\Thomas\\Desktop\\test.bmp");
    
    		auto stream = file.OpenReadAsync();
    
    
    }
    
    Allerdings kann man das nicht debuggen. Aich nicht im mixed mode. Kann man das einstellen, dass das Debuggen geht?
    Freitag, 13. September 2019 20:20