一. 几个概念:

  1. WinRT :

Windows Runtime, windows运行时。创建Windows运行时(WinRT)是为了在Windows上给用户提供一种流畅且安全的应用体验。WinRT会受到.NET、C++、以及JavaScript三者的影响。WinRT不会取代CLR或Win32,而是为那些使用不同语言编写的应用程序提供统一支持,以便它们可使用新的Metro风格用户界面运行于Windows之上。

两年前,微软从一个愿望开始了Windows运行时(WinRT)的研发工作,此愿望是,建立一个更好的开发平台,让开发者在此平台上使用具有丰富智能感知功能和优秀调试功能的工具来创造快速、流畅、可靠的应用程序,而且开发者可自由选择所使用的语言和库。最终结果是产生了一种架构以及一组可以从.NET语言(C#、VB.NET、F#)、C++、以及HTML/JavaScript调用的API。所有这些语言都会对WinRT的设计产生影响。WinRT不是为了取代.NET或Win32提供的所有功能,但是它是一个公共平台,以便那些使用不同语言编写的应用程序可使用新的Metro风格界面来运行。

(详细介绍参见:http://www.infoq.com/cn/news/2011/09/Design-Details-Windows-Runtime)

2. Win32 dll:

传统的Win32 dll

3. WinRT dll:

可以把WinRT dll看做是传统的Win32 dll,它们都是按照传统dll的封装形式,把接口或者类export出来,唯一的区别就是WinRT dll可以支持WinRT及其API。

4. WinRT Component:

WinRT组件的最大目的就是为了使组件能更好的支持被多种开发语言使用(js,C++,C#,VB)。而为了让开发者可以更方便的开发WinRT组件,微软又扩展了C++,也就是所谓的C++ /CX,所以基于C++ /CX风格的WinRT组件在接口风格,export形式上跟传统dll会有一定区别。

5. Windows Store Application:

Windows应用商店程序。Windows 应用商店应用是一类新型的应用程序,它在 Windows 8 设备上运行。Windows 应用商店应用不同于传统桌面应用。简单来说就是具有Metro风格的应用。

可以使用JavaScript、C#、Visual Basic 或 C++创建 Windows 应用商店应用。甚至可以采用一种语言编写组件,然后在采用另一种编程语言编写的应用中使用这些组件。

Windows 应用商店应用可以使用 Windows 运行时,一个内置于操作系统的本机 API。此 API 采用 C++ 实现,并支持 JavaScript、C#、Visual Basic 和 C++,对于每种语言都以非常自然的方式支持。

6.  Windows8 Platform and Tools图

二. 在Windows Store app中如何复用传统Win32 dll

  1. 新建一个WinRT dll的工程,把原来win32 dll的代码和配置直接移过来,编译时应该会发现一堆错误,基本应该都属于原来代码中用到了很多WinRT中不再支持的API,关于API的整合可以参考下文:

(【windows8开发】现有代码移植到Metro App所必须的API整合

http://blog.csdn.net/my_business/article/details/7895879 )

2. WinRT Dll 编译通过后,可以被WinRT组件和Windows应用商店程序调用。但是在调用时有一些限制。

简单来说就是:如果你的Windows Store app本身就是想用C++实现,那你可以在app中直接象往常加载dll一样的调用方式(导入lib或者LoadLibrary),就可以使用WinRT DLL了。

如果你的app本身要用C++以外的语言,C#或者js,那最好还是再封装一个WinRT组件,把WinRT DLL的接口包进来,方便被App调用, 有些文档中说可以在C#等app中直接add reference来关联WinRT DLL,但我试下来都失败了,而且即使是封装的WinRT组件,也必须是C++的工程,否则也无法引用WinRT DLL。

下面是我试验得出的结论:

3.  应注意的问题:

(1).在WinRT DLL工程中,在.h文件开头处,确保将 __declspec(dllexport) 用于你准备导出的函数,例如可以加入下列宏定义:

#ifdef ROOTERLIB_EXPORTS

#define ROOTERLIB_API  __declspec(dllexport)

#else

#define ROOTERLIB_API __declspec(dllimport)

#endif

然后,在定义类的时候,使用宏定义即可:

class ROOTERLIB_API CRooterLib

{

public:

CRooterLib(void);

double SquareRoot(double v);

private:

};

(2). 在WinRT DLL工程属性中要确保“Windows Store App Support”属性设置正确,Win32 dll工程中是No,而WinRT DLL中则是Yes:

(3). 创建WinRT DLL工程时,默认情况下是不支持WinRT API以及C++ /CX的,如果需要支持则需要进行如下改动:

注意当这里追加/ZW属性后,则一定要把/GM项去掉:

(4).在编译时,要注意WinRT DLL,WinRT组件,Windows Store App,三者之间的编译平台要保持一致,否则会编译通不过:

windows RT开发笔记:WinRT DLL及其调用研究的更多相关文章

  1. windows下开发PHP扩展dll(无需Cygwin)

    windows下开发php扩展网上很多资料都说需要Cygwin,其实完全可以不必安装该东东.没错,是可以在linux下生成骨架后拷到windos下来用,但是,如果没有linux环境呢?什么,装虚拟机? ...

  2. Android开发笔记(8)——调用子Activity

     转载请注明:http://www.cnblogs.com/igoslly/p/6853730.html  调用子Activity 需要子Activity返回值 MainActivity使用start ...

  3. Kinect开发笔记之二Kinect for Windows 2.0新功能

    这是本博客翻译文档的第一篇文章.笔者已经苦逼的竭尽全力的在翻译了.但无奈英语水平也是非常有限.不正确或者不妥当不准确的地方必定会有,还恳请大家留言或者邮件我以批评指正.我会虚心接受. 谢谢大家.   ...

  4. Android移动APP开发笔记——Cordova(PhoneGap)通过CordovaPlugin插件调用 Activity 实例

    引言 Cordova(PhoneGap)采用的是HTML5+JavaScript混合模式来开发移动手机APP,因此当页面需要获取手机内部某些信息时(例如:联系人信息,坐标定位,短信等),程序就需要调用 ...

  5. Delphi For Android 开发笔记-附:如何Delphi中同时实现Windows、Android版的GetModuleFileName函数

    在Windows中开发DLL时,经常会需要获取当前DLL所在目录以便读取同目录下的其他文件,而目前Delphi在开发android时,其实没多大必要获取,因为整个工程只有一个so文件,而这个so文件也 ...

  6. Windows下gcc以及Qt的DLL文件调用之总结(三种方法)

    DLL与LIB的区别 :1.DLL是一个完整程序,其已经经过链接,即不存在同名引用,且有导出表,与导入表lib是一个代码集(也叫函数集)他没有链接,所以lib有冗余,当两个lib相链接时地址会重新建立 ...

  7. iOS开发笔记--什么时候调用layoutSubviews

    iOS开发笔记--什么时候调用layoutSubviews 分类: iOS2014-04-22 16:15 610人阅读 评论(0) 收藏 举报 今天在写程序时候遇见layoutSubviews触发时 ...

  8. Windows Phone开发(47):轻松调用Web Service

    原文:Windows Phone开发(47):轻松调用Web Service 众所周知(除了没用过VS的),在VS里面调用Web Service是一件很愉快的事情,不解释,相信很多朋友在以前的项目中肯 ...

  9. Windows 8.1 store app 开发笔记

    原文:Windows 8.1 store app 开发笔记 零.简介 一切都要从博彦之星比赛说起.今年比赛的主题是使用Bing API(主要提到的有Bing Map API.Bing Translat ...

随机推荐

  1. redux超易学三篇之三(一个逻辑完整的react-redux)

    配合源代码学习吧~ : 我是源代码 这一分支讲的是 如何完整地(不包含优化,也没有好看的页面) 搭建一个 增删改查 的 react-redux 系统 不同于上一节的 react-redux,这里主要采 ...

  2. [转][Java]使用Spring配合Junit进行单元测试的总结

    http://www.51testing.com/html/14/n-1408814.html 1.直接对spring中注入的bean进行测试(以DAO为例): 在测试类上添加@RunWith注解指定 ...

  3. CodeForces - 779D String Game(二分)

    Little Nastya has a hobby, she likes to remove some letters from word, to obtain another word. But i ...

  4. R语言排序函数汇总

    总结: 1.sort是直接对向量排序,返回原数值: 2.order先对数值排序,然后返回排序后各数值的索引: 3.rank返回原数据各项排名,有并列的情况: 4.arrange是dplyr包中的,可对 ...

  5. [转] JAVA从本机获取IP地址

    [From] https://www.cnblogs.com/xiaoBlog2016/p/7076230.html 论述: 此篇博客是在工作的时候,需要获得当前网络下面正确的ip地址,在网上查阅很多 ...

  6. Ubuntu电源键软关机设置

    对于不连接显示器的Ubuntu设备,通过直接拔电源或者长按电源键是普遍的关机方法,但这种方法长期势必会对设备造成损坏. 下面设置电源键软关机(短摁电源按钮关机)的方法可以解决此问题.(默认摁电源键会弹 ...

  7. Linux——【rpm、yun、源码包】安装

    RPM包或者安装源码包 在windows下安装一个软件很轻松,只要双击.exe的文件,安装提示连续“下一步”即可,然而linux系统下安装一个软件似乎并不那么轻松,因为我们不是在图形界面下.所以我们要 ...

  8. PHP 设置 socket连接

    摘要: 作者博文地址:https://www.cnblogs.com/liu-shuai/ nginx和fastcgi的通信方式有两种,一种是TCP的方式,一种是unix socket方式. sock ...

  9. 两种请求方式URLHttpconnection 和Httpclient提交表单 网络篇(二)

    安卓有两种发送请求的方式:URLHttpconnection 和Httpclient 下面就来讲下这两种方式,这篇是最基础的使用 进阶请看第二篇  先占位 打扫卫生去了T T 快过年了 框架就放网络篇 ...

  10. 让C:\Users文件夹放在D盘

    新安装win7 在安装Win7的过程中,要求输入用户名及密码的时候,先不如输入任何信息,按“Shift+F10”呼出DOS窗口,输入以下命令: robocopy "C:\Users" ...