在windows phone Mango中使用原生代码开发程序

    本文不讨论创建可执行的exe程序,主要想说明怎么在silverlight程序里面调用由原生代码所编写的DLL(C++ / ARM).

    原生代码可以调用更多的API,但是这并不是说你就能随意获得那些你没有权限的资源,比如,你可以使用CopyFile这个API,但是如果你试图把文件Copy到\Windows文件夹,就会得到一个0x4ec的错误代码,系统会禁止你这样做.所以,你的程序也只能在沙箱的环境下运行.

    本文中所涉及的知识包含 C++,COM交互,Windows phone 程序设计.希望你在开发你的程序前能保证熟悉这些技术.因为原生代码还不能调试,所以你只能使用返回错误信息的方式来确保你的程序能正确运行.

    需要注意的是: 如果你有些任务需要执行很长时间,它们在调试的时候能很好的运行,但是在实际运行的时候,你最好采用一个线程来做这些事情.因为在非调试状态下检测程序会检测你的程序,一但你的程序锁定超过10秒,那么系统会自动退出这个程序.

   有人建议原生代码所写的DLL需要签名,其实这并不是必须的.在Mango设备里面可以使用未签名的库.

   讨论一下互操作锁.详细讨论可以参见这个贴子.互操作锁在WP7.5里面出现.最直观的表现就是你的程序如果使用了ID_CAP_INTEROPSERVICES,那么所使用的设备必须得解锁.

   下面就是一个详细的操作步骤:

 PS: 所需要的软件请点击名称下载

   1. 安装 Visual Studio 2008 及 最新的补丁包,确保安装 C++.

   2. 安装 Windows Modile 6 Professional SDK Resfresh.

   3. 安装 Visual Studio 2010 和 最新的补丁包.

   4. 安装 Windows Phone SDK 7.1

   5. 下载 Microsoft.Phone.InteropServices.zip. 下载解压后要确定文件是非锁定状态,解锁可以按以下操作,文件是点击右键,选择属性,点击解锁.

   6. 把Microsoft.Phone.InteropServices.dll放到  C:\Program Files\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone71 ,如果是64位系统就放到 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone71.

   7. 打开 Visual Studio 2010 的命令行工具,转到Microsoft.Phone.InteropServices.dll放置的地方,输入以下代码,请确定注册成功.否则引用这个DLL时会报没有引用命名.

SN -Vr Microsoft.Phone.InteropServices.dll

 8. 在DLL的目录下有一个RedistList文件夹,里面有一FrameworkList.xml,加下面代码

<File AssemblyName="Microsoft.Phone.InteropServices" Version="7.0.0.0" Culture="neutral" ProcessorArchitecture="MSIL" InGac="false" />

 9.  安装 zune

   10. 打开 VS2008,创建新项目.

   11. 选择 Visual C++ / Smart Device / ATL Smart Device 项目,不能选择MFC.

   12. 点击下一步

   13. 取消 Pocket PC 2003,加入 Windows Mobile 6 Pro SDK,点击下一步

   14. 点击完成

   15. 编译设置为 Release.

   16. 在工程属性 / 属性配置 / C/C++ / 预处理 / 预处理定义里面加入 

_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA

 17. 在工程里面加入一个新类 , 选择 "Simple ATL object"

   18. 对话框内 "Short name"是 Com类的名字,其他可以保持默认,点击完成.

   19. 文件添加就完成了.包含这些文件 : 头文件(.h) ,代码文件 (.cpp) , Com定义文件(.idl), Com类的头文件(.h),Com类的代码文件(.cpp).

   20. 把Com类的基类改成 IUnknown.

   21. 在Com类的头文件中,删除下面这一句

COM_INTERFACE_ENTRY(IDispatch)

 22. 在IDL文件中,把IDispatch改成IUnknown.

   23. 现在可以向你的Com类加入方法了.所有方法都必须以HRESULT为返回值.这个值用来判断函数是否执行成成功.成功可以返回 S_OK,如果有错误代码,则把错误代码与0x80070000进行逻辑或的结果做为返回值.如果你想返回一个变量,你需要在IDL文件里面声明他.参数以COM为边界,参见这里和这里查看COM支持的参数类型.

   24. 在COM类中加入如下代码:

 1 STDMETHODIMP CNative::TestMethod1()
2 {
3 BOOL result = ::CopyFile(L"\\Windows\\0000_System.Windows.xaml", L"\\Windows\\Test.xaml", TRUE); //这里会抛出一个异常
4 if (result)
5 return S_OK;
6 else
7 return 0x80070000 | ::GetLastError();
8 }
9 STDMETHODIMP CNative::TestMethod2(BSTR InputString, BSTR* OutputString)
10 {
11 size_t size = 1000; // in chars
12 TCHAR* msg = new TCHAR[size];
13 wcscpy_s(msg, size, L"\0");
14
15 LPWSTR value = new WCHAR[20];
16
17 _itow((int)wcslen(InputString), value, 10);
18 wcscat_s(msg, size, L"Length of string is: ");
19 wcscat_s(msg, size, value);
20
21 *OutputString = SysAllocString(msg);
22
23 delete[] msg;
24 delete[] value;
25
26 return S_OK;
27 }

 25. Com类的头文件中加入下面代码,放在END_COM_MAP()后面

1 STDMETHOD(TestMethod1)();
2 STDMETHOD(TestMethod2)(BSTR InputString, BSTR* OutputString);

 26. 在IDL文件里面加如如下代码,关于参数定义,可以查看 点击我吧

1 HRESULT TestMethod1();
2 HRESULT TestMethod2(BSTR InputString, BSTR* OutputString);

 27. 记下IDL文件里面的接口GUID(uuid标识),类标识GUID.

   28. 在VS2010里面创建一个新的WP工程.

   29. VS2008里面编译生成DLL,然后把DLL拷贝到WP工程目录下.

   30. 在WP工程下创建WPInteropManifest.xml文件,内容为

1 <?xml version="1.0" encoding="UTF-8"?>
2 <Interop>
3 </Interop>

  31. 更改WPInteropManifest.xml文件的编译规则为"Content","Copy if newer".

  32. 更改COM输出的DLL编译规则为"Content","Copy if newer"

  33. WP工程添加引用"Microsoft.Phone.InteropServices"

  34. 打开WMAppManifest.xml文件,添加

<Capability Name="ID_CAP_INTEROPSERVICES" />

  35. 添加一个代码文件 输入以下内容:

 

 1 using System.Runtime.InteropServices;
2
3 [ComImport, ClassInterface(ClassInterfaceType.None), Guid("YOUR-COCLASS-GUID-GOES-HERE")]
4 public class CNative
5 {
6 }
7
8 [ComImport, Guid("YOUR-INTERFACE-GUID-GOES-HERE"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
9 public interface INative
10 {
11 void TestMethod1();
12 [return : MarshalAs(UnmanagedType.BStr)]
13 string TestMethod2([MarshalAs(UnmanagedType.BStr)] string InputString);
14 }

   36.创建一个测试代码文件,输入以入内容

 1 uint retval = Microsoft.Phone.InteropServices.ComBridge.RegisterComDll("Your Com DLL.dll", new Guid("YOUR-COCLASS-GUID-GOES-HERE"));
2 INative MyNativeCodeInstance = (INative)new CNative();
3 string result1 = "OK";
4 try
5 {
6 MyNativeCodeInstance.TestMethod1(); //这里抛出一个异常
7 }
8 catch (Exception ex)
9 {
10 result1 = ex.Message;
11 }
12 string result2 = MyNativeCodeInstance.TestMethod2("Hello, Mango!");
13 MessageBox.Show(result1 + Environment.NewLine + result2);

   37. 运行程序,测试代码.

   38. 注意,当使用高级功能时.我们需要Marshal-class,比如操作内存等.此时需要使用Microsoft.Phone.InteropServices内的Marshal类,如果使用System.Runtime.InteropServices命名空间下的此类,会抛出一个MethodAccessException异常.

   关于简单的调用方法就说到这里.希望大家都能搞出更好的自制程序.如果翻译或者描述有不准确的地方,希望大家指正,谢谢!!

原贴地址: http://forum.xda-developers.com/showthread.php?t=1299134

转载于:https://www.cnblogs.com/thilong/archive/2012/02/25/2367556.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 198. 打家劫舍 思考分析

目录1、题目2、求解思路3、代码1、题目 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动…

找不到Windows照片查看器解决方法

桌面创建一个txt文本 复制这些命令&#xff0c;之后将后缀改为.reg&#xff0c;右击管理员身份运行即可 Windows Registry Editor Version 5.00 ; Change Extensions File Type [HKEY_CURRENT_USER\Software\Classes\.jpg] "PhotoViewer.FileAssoc.Tiff" ; Change E…

数字拆分为斐波那契数列_检查数字是否为斐波那契

数字拆分为斐波那契数列Description: 描述&#xff1a; We are often used to generate Fibonacci numbers. But in this article, we are going to learn about how to search Fibonacci numbers in an array? 我们经常被用来产生斐波那契数。 但是在本文中&#xff0c;我们…

伙伴分配器的一个极简实现

提起buddy system相信很多人不会陌生&#xff0c;它是一种经典的内存分配算法&#xff0c;大名鼎鼎的Linux底层的内存管理用的就是它。这里不探讨内核这么复杂实现&#xff0c;而仅仅是将该算法抽象提取出来&#xff0c;同时给出一份及其简洁的源码实现&#xff0c;以便定制扩展…

[USACO3.2.3 Spinning Wheels]

[关键字]&#xff1a;模拟 枚举 [题目大意]&#xff1a;有5个轮子&#xff0c;每个轮子优r个缺口并且会按一定速度不停转动&#xff0c;问什么时候可以使一条光线射过所有轮子。 // [分析]&#xff1a;从0到1000&#xff08;或其他的&#xff09;枚举分钟然后判断&#xff0c;当…

一、SQLServer2008安装(带密码)、创建数据库、C#窗体项目测试

一、下载和安装SQLServer2008 东西太大了&#xff0c;没法上传到资源里面&#xff0c;官网其他公众号都下载可以。 右击管理员身份 运行setup.exe 这个密钥不能用的话&#xff0c;也可以去百度其他密钥 JD8Y6-HQG69-P9H84-XDTPG-34MBB 建议改一下路径&#xff0c;我这边修…

python获取当前日期_Python程序获取当前日期

python获取当前日期In the below example – we are implementing a python program to get the current date. 在下面的示例中-我们正在实现一个python程序来获取当前日期 。 Steps: 脚步&#xff1a; Import the date class from datetime module. 从datetime模块导入日期类…

【C++grammar】多态、联编、虚函数

目录1、多态概念1.多态性有两种表现的方式2、联编&#xff08;实现多态&#xff09;1.静态联编2.动态联编3、实现运行时多态1.为何要使用运行时多态&#xff1f;2.如何实现运行时多态3.多态的例子1.调用哪个同名虚函数&#xff1f;2. 用途&#xff1a;可以用父类指针访问子类对…

一 MVC - HtmlHelper

HtmlHelper类位于System.Web.Mvc.Html之中主要有七个静态类组成&#xff1a; FormExtensions - BeginForm, BeginRouteForm, EndForm InputExtensions - CheckBox, CheckBoxFor, Hidden, HiddenFor, Password, PasswordFor, RadioButton, RadioButtonFor, TextBox, TextBoxFor …

HDOJ 400题纪念。

刚刚交了1506&#xff0c;无意间瞟到左边的随笔数&#xff0c;发现已经401题了&#xff0c;这么说前几天就400题了啊囧。 昨天还想交到400题就先放放&#xff0c;背单词的&#xff0c;没想到那么快。等把USACO那个八皇后写完吧。人生总是有许多不想做又不得不做的事情。。。 还…

二、用户登录和注册

一、页面设计 一共四个页面 主页面Form1&#xff0c;登录页面login&#xff0c;注册页面resister&#xff0c;主菜单页面main_page 系统运行进入Form1&#xff0c;单击登录按钮跳转到login&#xff0c;数据库中得存在数据信息且输入正确才可登录成功&#xff0c;跳转到main_pa…

readdir函数_PHP readdir()函数与示例

readdir函数PHP readdir()函数 (PHP readdir() function) The full form of readdir is "Read Directory", the function readdir() is used to read the directory i.e. read the name of the next entry in the directory. readdir的完整形式为“ Read Directory”…

【C++grammar】访问控制与抽象类与纯虚函数

目录一、访问控制 (可见性控制)1.private、public、protected关键字2.关键字示例1、关键字对类数据成员访问的限制3. 公有继承4. 私有继承5. 保护继承6. 私有继承和保护继承的区别二、抽象类与纯虚函数1.什么是抽象类2.抽象函数/纯虚函数3.抽象类示例一、访问控制 (可见性控制)…

mongodb 如何删除 字段值为 json对象中的某个字段值

例如&#xff1a; { attributes: { birthday:1988-01-01, name: aq } } birthday是attributes字段的value的一个字段&#xff0c; 我要删除birthday 用这句话&#xff1a; db.User.update({email:adminlinkris.com},{$unset:{attributes.birthday:}})转载于:https://www.cnblog…

使用 Spring 的 Web 服务模拟器框架解决方案

http://www.ibm.com/developerworks/cn/web/wa-aj-simulator/index.html转载于:https://www.cnblogs.com/diyunpeng/archive/2012/02/28/2371390.html

三、上传织物图片至SQL Server并提供name进行展示织物照片

一、数据库的建立 还是在fiber_yy数据库下创建images表 images表设计如下 二、页面完善设计 main_page页面进行功能完善 入库管理系统 warehousing页面 库存查询系统 query页面 登录注册页面前面几个博文已经实现过了&#xff0c;这里就再赘述了&#xff0c;仍是沿用前…

gettype_PHP gettype()函数与示例

gettypePHP gettype()函数 (PHP gettype() function) In PHP, we have a library function gettype() to identify the type of data. The function is primarily used to sanity check the type of data being input in a variable. The function can identify the data into …

ARM MMU工作原理剖析[转]

一、MMU的产生 许多年以前&#xff0c;当人们还在使用DOS或是更古老的操作系统的时候&#xff0c;计算机的内存还非常小&#xff0c;一般都是以K为单位进行计算&#xff0c;相应的&#xff0c;当时的程序规模也不大&#xff0c;所以内存容量虽然小&#xff0c;但还是可以容纳当…

栈与队列在SGI STL的底层实现

栈 栈提供push和pop等接口&#xff0c;不提供走访功能&#xff0c;也不提供迭代器。 STL中栈不被归类为容器&#xff0c;而被归类为container adapter(容器适配器)&#xff0c;这是因为栈是以底层容器完成其所有的工作&#xff0c;对外提供统一的接口&#xff0c;底层容器是可…

【原创】SharePoint Document library List Check out 文档时碰到的问题解决

环境&#xff1a;TFS(Team Foundation Server)集成的WSS 3.0&#xff08;SharePoint Service 3.0&#xff09; 问题&#xff1a;如题&#xff0c;祥见下图 解决&#xff1a;一般碰到没有经验的问题&#xff0c;大家当然是外事不决问谷歌了&#xff0c;于是谷歌搜到了这篇博客 h…