I’m currently working on a metro app that requires a few textual resources. Part of the build process is copying all of these resources to a folder inside of the app’s installation directory. What I’d like to do is gather a list of these resource files, and process each one accordingly. Unfortunately, my attempts to do so have been less than successful.
Since I’m building for WinRT, I can’t use the very useful “FindFirstFile” and “FindNextFile” functions. I’ve been trying to get the job done using the WinRT Asynchronous file IO operations.
auto getResourceFolder = installedLocation->GetFolderFromPathAsync( folderPath );
getResourceFolder->Completed = ref new Windows::Foundation::AsyncOperationCompletedHandler< Windows::Storage::StorageFolder^ >(
[this]( Windows::Foundation::IAsyncOperation< Windows::Storage::StorageFolder^ >^ operation ) {
if( operation->Status == Windows::Foundation::AsyncStatus::Completed ) {
auto resourceFolder = operation->GetResults();
auto getResourceFiles = resourceFolder->GetFilesAsync();
getResourceFiles->Completed = ref new Windows::Foundation::AsyncOperationCompletedHandler< IVectorView< Windows::Storage::IStorageFile^ >^ >(
[this]( Windows::Foundation::IAsyncOperation< IVectorView< Windows::Storage::IStorageFile^ >^ >^ operation ) {
if( operation->Status == Windows::Foundation::AsyncStatus::Completed ) {
auto resourceFiles = operation->GetResults();
for( unsigned int i = 0; i < resourceFiles->Size; ++i ) {
// Process File
}
}
});
}
});
Which fails to compile:
error C2664: ‘Windows::Foundation::IAsyncOperation<TResult>::Completed::set’ : cannot convert parameter 1 from ‘Windows::Foundation::AsyncOperationCompletedHandler<TResult> ^’ to ‘Windows::Foundation::AsyncOperationCompletedHandler<TResult> ^’
The error isn’t making any sense to me. I’ve tried rewriting the above code so that the lambda handler functions are not inline, but it hasn’t made a difference. I’m not sure what’s wrong.
Any ideas? Thanks in advance.
[Note: I have omitted most namespace qualification from the code and error messages for brevity.]
The Visual Studio Error List pane only shows the first line of each error (this is a very useful feature, especially when programming in C++, because some error messages from the compiler are exceedingly long. You need to look at the Output window to see the rest of the error message:
This is still a bit confusing because all three templates use a parameter named
TResult. To decipher the error, note that the order of the templates in the first line matches the order of the template argument lists in the rest of the line.The issue here is that you are mixing usage of
StorageFileandIStorageFile. On both of these lines, you need to useStorageFile(see carrots under lines for whereIStorageFileis used):Note that once you fix this issue, you’ll get another pair of errors because your lambdas need to have two parameters; the second is an
AsyncStatus. In the end, they should both be declared as:Note that you can, in fact, use both
FindFirstFileExandFindNextFilein a Metro style app. (The non-ExFindFirstFileis not usable).You should use the asynchronous WinRT functions wherever you can and wherever it is practical, but that doesn’t mean there isn’t still a use for these other functions.