WinRT出来有3年了,用的人并不多,用C++来用它的人更是少。
照成这样不外乎Windows 8平台不给力,用户基数少,但是WinRT本身的难用也是一个方面的原因,首先WinRT的所谓大宇50ms的任务全部Async化,这对习惯了传统Win32桌面的程序员来说 —— 你在逗我玩呢。
现在我们来简单看看WinRT的Async模型。
实在没太多必要介绍那些理论知识,就像这种文章:
http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/03/26/windows.aspx
或者这种文章:
http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/04/30/winrt-await.aspx(深入探究 WinRT 和 await)
这些文章充满了浆糊和痛苦,就像MSDN写的函数声明介绍一样。
我希望屏幕前的你对微软的传统COM技术(进程内COM)有了解,知道ATL帷幔之下的COM原始情况,也就是我希望你曾经徒手从IUnknown开始,到QueryInteface,到AddRef、Release写过,然后使用DllGetClassObject来new这个实例,也就是你曾经有过不错的COM开发经验,对COM有较好的认识。
如果你不曾了解这些,这文章还是关了把,上面那2个的连接也许有一个适合你。
嗯,这篇文章是为我们传统的Win32桌面C++程序员准备的!
异步,对我们传统的Win32程序员来说。
不外乎:
SubmitTask
DoWork(new Thread)...
CallbackNotify
EndTask
也就是,我们跑的Task,必需要能同步\异步通知到它的所有者,并且把处理结果交过来。
那WinRT的异步,也不外乎这样。
来我们看代码,下面的代码,请建立控制台工程:
恩对,是微软脑残,好了这个不说。
我们看到我们拿到了一个IStorageFolder接口实例,代码目前还算正常。
然后我们想在视频文件夹里面新建立一个文件,IStorageFolder提供了一个名为 CreateFileAsync的脑残方法,我们看看这个方法:
照成这样不外乎Windows 8平台不给力,用户基数少,但是WinRT本身的难用也是一个方面的原因,首先WinRT的所谓大宇50ms的任务全部Async化,这对习惯了传统Win32桌面的程序员来说 —— 你在逗我玩呢。
现在我们来简单看看WinRT的Async模型。
实在没太多必要介绍那些理论知识,就像这种文章:
http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/03/26/windows.aspx
或者这种文章:
http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/04/30/winrt-await.aspx(深入探究 WinRT 和 await)
这些文章充满了浆糊和痛苦,就像MSDN写的函数声明介绍一样。
我希望屏幕前的你对微软的传统COM技术(进程内COM)有了解,知道ATL帷幔之下的COM原始情况,也就是我希望你曾经徒手从IUnknown开始,到QueryInteface,到AddRef、Release写过,然后使用DllGetClassObject来new这个实例,也就是你曾经有过不错的COM开发经验,对COM有较好的认识。
如果你不曾了解这些,这文章还是关了把,上面那2个的连接也许有一个适合你。
异步,对我们传统的Win32程序员来说。
不外乎:
SubmitTask
DoWork(new Thread)...
CallbackNotify
EndTask
也就是,我们跑的Task,必需要能同步\异步通知到它的所有者,并且把处理结果交过来。
那WinRT的异步,也不外乎这样。
来我们看代码,下面的代码,请建立控制台工程:
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <string>
#include <iostream>
#include <memory>
#include <Windows.h>
#include <wrl.h>
#include <wrl\client.h>
#include <wrl\wrappers\corewrappers.h>
#include <roapi.h>
#include <windows.storage.h>
#include <windows.storage.streams.h>
using namespace Microsoft::WRL;
using namespace Microsoft::WRL::Wrappers;
using namespace ABI::Windows::Foundation;
using namespace ABI::Windows::Storage;
using namespace ABI::Windows::Storage::Streams;
int main()
{
RoInitialize(RO_INIT_MULTITHREADED);
ComPtr<IKnownFoldersStatics> pKnownFolders;
HRESULT hr = RoGetActivationFactory(HStringReference(RuntimeClass_Windows_Storage_KnownFolders).Get(),
IID_PPV_ARGS(pKnownFolders.GetAddressOf()));
ComPtr<IStorageFolder> pFolder;
pKnownFolders->get_VideosLibrary(&pFolder);
RoUninitialize();
getchar();
return 0;
}
好了,可以看到,我们拿到了用户的视频文件夹,从上面的代码大家可以发现,这些代码,头文件和using多生死,主函数真正有用的代码满打满算就
4行,是不是微软脑残?
恩对,是微软脑残,好了这个不说。
我们看到我们拿到了一个IStorageFolder接口实例,代码目前还算正常。
然后我们想在视频文件夹里面新建立一个文件,IStorageFolder提供了一个名为 CreateFileAsync的脑残方法,我们看看这个方法: