在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.pswp.cn/news/377722.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377722.shtml
英文地址,請注明出處:http://en.pswp.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…