首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

建立牢固的多功能Smartphone应用程序 02

建立牢固的多功能Smartphone应用程序 02

与Web应用程序不同,你能使用类似嵌入式(eMbedded)Visual C++的工具来开发一个定制的应用程序。幸运的是Smartphone 与Pocket PC平台相似。因为大多数API相同,使用嵌入式Visual C++为Pocket PC平台开发的应用程序能简单地移植到Smartphone上,其结果是在很大程度上节省了为两个设备开发的成本。我移植了两个应用程序,一个只需要简单地重新编译,另一个只花了结果几个小时来解决平台之间的微弱不同。

开发独立的应用程序时你有更大的灵活性,这类应用程序往往更加牢固,并能用于连接和不连接的模式。对多数商业应用,独立的应用程序也许是最好的选择。它们在离线环境下使用,也提供了根据需要在远程系统间传递数据的机制。

此外,独立应用程序也可以使用特定设备的特性,包括技术特性和访问本地数据存储,例如Pocket Outlook和Windows CE数据库(CEDB)引擎。当离线时,为了将来同步,数据可以被存储起来。但是,独立应用程序面临着更多的分发和维护问题。此外建立独立应用程序还需要 C++经验,通常它的成本更高并难以找到开发者。但是这种情况不会发生了,预计微软.NET Compact Framework和Smart Device Extensions最后将支持Smartphone。如果这实现了,开发者可以使用C#和Visual Basic .NET等语言建立Smartphone应用程序。



数据检索

因为任何商业应用程序最基本的特性是检索数据,设计的部分问题围绕可用连接的类型。你能依赖持续的连接或者连接可能中断吗?你的系统只有一定的次数和访问点才需要连接吗?

Smartphone 为从远程数据源检索数据提供了几种选择。一种是ActiveSync,你可以使用它手动地在桌面计算机和Smartphone之间推/拉(push/pull)文档。另一个选择是编程从PC上访问该设备并使用远程API(RAPI)复制文件。虽然这些方法完成了任务,但是不是最好的选择。 Smartphone的内建互联网连接更好。

在Smartphone设备上通过互联网检索远程数据非常简单。实际上,如果你已经开发了一个通过互联网检索数据的Pocket PC应用程序,就已经知道所有需要的了。在Smartphone上与远程服务器通讯的最简单的方法是WinInet功能(HTTP或者FTP)、在远程载入数据的XMLDOM API和微软互联网浏览器(见图2)。



图2.在Smartphone上检索远程数据

XMLDOM 给Web开发人员提供了几种数据检索的方法。使用DOM你能通过两个主要的方法检索数据:文档对象和XMLHTTP对象的Load方法。两个对象都允许从远程Web服务器上的XML格式中检索数据。两者之间最大的区别是XMLHTTP对象允许你传递一个XML对象作为调用的一部分,尽管Load命令没有允许。在为了检索数据而需要传递数据的情况下,你应该使用XMLHTTP对象。

不管你在XMLDOM中使用那种方法,只需要在代码中作一点点更改。首先你必须包括正确的头文件:


#include namespace MSXML{#include }#include


objsafe.h 和ocidl.h都是必须的,因为它们包含GUID描述,而GUID是与COM一起工作的指针必须的。为了使COM调用进入MSXML分析程序,你必须建立MSXML名字空间并包含msxml.h。此外,为了项目编译正确,你应该把ole32.lib和oleaut32.lib库添加到连接程序设置中。

一旦代码使用XMLDOM,你能简单地使用DOMDocument 的load方法从远程服务器检索数据。该方法只需要一个能找到并检索数据的URL。它在文档中重复构建窗体上的一个微调控件(spinner control)(图3)。完成后它显示一个包含整个XML文档的消息框。

MSXML::IXMLDOMDocument     *iXMLDoc     = NULL;MSXML::IXMLDOMParseError   *pParsingErr = NULL;MSXML::IXMLDOMElement      *iXMLElm     = NULL;MSXML::IXMLDOMNodeList     *iXMLChild   = NULL;MSXML::IXMLDOMNode         *iXMLItem    = NULL;short tEmpty;BSTR bStr;VARIANT         vXMLSrc;HRESULT         hr;HWND            hListBox;long            lLength;hr = CoInitializeEx(NULL,COINIT_MULTITHREADED);if(!SUCCEEDED(hr)) return 0;hr = CoCreateInstance (MSXML::CLSID_DOMDocument,     NULL,CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,    MSXML::IID_IXMLDOMDocument, (LPVOID *)&iXMLDoc);if(iXMLDoc){   iXMLDoc->put_async(VARIANT_FALSE);   //Smartphone 2002 工作区:   //删除文档安全选项   IObjectSafety *pSafety;   DWORD dwSupported, dwEnabled;   if ( SUCCEEDED(iXMLDoc->QueryInterface(                  IID_IObjectSafety, (void**)&pSafety)))   {      pSafety->GetInterfaceSafetyOptions(      MSXML::IID_IXMLDOMDocument, &dwSupported, &dwEnabled );      pSafety->SetInterfaceSafetyOptions(      MSXML::IID_IXMLDOMDocument, dwSupported, 0 );   }    VariantInit( &vXMLSrc );    vXMLSrc.vt = VT_BSTR;    iXMLDoc->put_async(VARIANT_FALSE);    vXMLSrc.bstrVal = SysAllocString(L"http:/localhost/                      smartphonearticledata.xml");    hr = iXMLDoc->load(vXMLSrc, &tEmpty);    SysFreeString(vXMLSrc.bstrVal);   iXMLDoc->get_documentElement(&iXMLElm);    iXMLElm->selectNodes(L"//DATA/STATUS/S",&iXMLChild);   //iXMLElm->get_childNodes(&iXMLChild);    iXMLChild->get_length(&lLength);    hListBox = GetDlgItem( hWnd, IDC_LISTISSUES);    for (int x=0;xget_item(x,&iXMLItem);        iXMLItem->get_text(&bStr);        SendMessage (hListBox, LB_ADDSTRING, 0, (LPARAM) bStr);     }   //iXMLChild->get_item(1,&iXMLItem);   iXMLDoc->get_xml(&bStr);   MessageBox(NULL,bStr,TEXT("Article Demo"),MB_OK);


图3.XML Load方法示例



本地存储数据

在检索数据到Smartphone后,下一步是研究在设备上本地存储数据的方法。一种选择是根本不保存。你可以检索数据,执行一些操作,接着从内存中释放数据。不幸的是在大多数情况下没有这么简单,因此你不得不决定适合应用程序的格式。你也许会保存数据到文件存储(例如闪存卡),或者保存在本地的数据存储(例如CEDB)中。
返回列表