现有代码移植到Metro App
一:工程配置
配置WinRT工程时要注意以下几点:
- 静态库工程General里的“Windows Store App Support”设成true
- C++\General下面的“Consume Windows Runtime Extension”设成Yes,设置该选项的目的是:引入MicroSoft C++/CX,如果你的工程代码是由C语言写的,并且没有调用Win32 API,不需要进行该项设置。否则.c文件都是无法在该选项下编译的。
- C++\Code Generation下的“Enable Minimal Rebuild”设成“No”
- C++\Precompiled Headers下的“Precompiled Header”设成“Not Using Precompiled Headers”
- C/C++\ Code Generation \ Basic Runtime Checks 设置为Default(是相关的全部工程,包括静态库和动态库)
- C/C++\ Code Generation \Runtime Library设置正确,当在Release模式下,要设置为Multi-threaded DLL。
- app中添加Microsoft Visual C++ Runtime Package的Reference
二:WACK检测
1: 在编译工程中,会发现很多以前支持的Win32 API已经不支持了,我们使用Metro App替换即可。
在替换已经不支持的api过程中可以参考这篇文章 http://blog.csdn.net/my_business/article/details/7895879
2:当编译通过后,就可以认证了,有两点需要注意:(1):库必须是Release版本的(注意工程配置中的第六点)。(2)WACK只能检测App,所以库需要和app一起检测。
认证包的生成可以参考这篇文章http://www.cnblogs.com/linyehui/archive/2012/05/08/winrt-for-win32-programmers-part-ii-port-code-to-winrt.html
3:认证过程中会出现很多错误。
常见的错误处理可以参考这篇文章http://www.cnblogs.com/chenkai/archive/2013/01/25/2877274.html
以下两个错误是我工作中碰到的,上述文章中没有设计,现在与大家分享解决方案
错误1:
类似API xxxxx invccorlib110.dll(或者msvcr110.dll) is not supported for thisapplication type.
这里的重点是调用了vccorlib110.dll(或者msvcr110.dll),解决方案是,在你的app中添加Microsoft Visual C++ Runtime Package即可。
错误2:
此应用程序类型不支持 kernel32.dll 中的 API GetModuleFileNameW。xxx.dll 调用此 API。
此应用程序类型不支持 kernel32.dll 中的 API LoadLibraryExW。xxx.dll 调用此 API。
此应用程序类型不支持 kernel32.dll 中的 API LoadLibraryW。xxx.dll 调用此 API。
首先你要保证你的程序和库没有这三个函数,
如果确实没有引用这三个函数,请查看你全部工程的工程配置,有没有这么设置C/C++\ Code Generation \ Basic Runtime Checks 设置为Default,就是工程配置中的第五点.
错误3:OutputdebugString
程序中不要调用OutputdebugString,虽然该函数是合法的,但是无法通过WACK,所以在生成程序的时候,一定要把去掉全部的OutputdebugString.OutputdebugString包括OutputdebugStringA和OutputdebugStringW