• loadlibrary失败 > 田凯,孟志军 ,王武宏
  • 田凯,孟志军 ,王武宏

    免费下载 下载该文档 文档格式:PDF   更新时间:2014-09-13   下载次数:0   点击次数:1
    1 Windows CE 远程应用程序接口(Remote API)的应用研究 田凯1、2 ,孟志军 1 ,王武宏 2 (1、国家农业信息化工程技术研究中心,100089;2、北京理工大学,100081) 摘要:主要介绍如何利用嵌入式操作系统Windows CE远程应用程序接口RAPI实现开发应用, 同时以访问掌上电脑的文件体系和转换数据库文件为例,介绍RAPI应用中需要注意的问题. 关键词:Windows CE; 嵌入式操作系统; RAPI The development and application of Remote API of Windows CE Kai Tian1、2 ,ZhiJun Meng1 ,WuHong Wang2 (1、National Engineering Research Center for Information Technology in Agriculture,100089) (2、Beijing Institute of Technology,100083) Abstract:This paper introduces how to use Remote API of Winodows CE to develop application, meanwhile it can be used to interview the file system of PDA and convert database file, also there are some questions we should pay attention to in using it. Key words: Windows CE; Embedded operation system; RAPI 中图分类号:TP31 文献标识码:B 引言 随着信息化浪潮的不断推进,各种各样的嵌入式系统正以前所未有的速度在我们身边不 断的出现, 而且随着人们对嵌入式系统的功能提出了越来越高的要求, 以单片机为核心的嵌 入式系统已经远远不能满足要求. 在微处理器芯片性能不断提高的同时, 同样还需要嵌入式 的操作系统能够对设备进行有效的管理,提高软件开发的速度和智能的人机交互环境. Windows CE、嵌入式Linux、UC/OS等等就是在这样的情况下出现的. 1. Windows CE及RAPI功能介绍 Windows CE是一个新的、可移植的、实时的、模块化操作系统,具有流行的微软程序开发 接口,支持嵌入式专用系统的快速开发,同时它也是为那些非常重视ROM和RAM内存引脚的最 小设备设计的.COREDLL.DLL中的函数是Windows CE中最不寻常的部分,换而言之,所有的 CE设备都必须包括该动态连接库.如果您应用COREDLL.DLL中的函数新建一个应用程序,那 么您的应用程序便可在其它正在运行Windows CE的每个设备上运行 [1] .Windows CE包含操作 系统的最关键的四个模块:内核模块、对象存储模块、通信模块和图形、窗口及事件模块 , 另外还有一些可选模块. Windows CE的特点使它在各种手持终端中得到了广泛的应用,尤其在掌上电脑中的应用 尤为广泛. 用掌上电脑采集信息非常的方便, 但是如果要对采集的信息进行细致的处理就必 然要用到PC机, 而要解决他们之间通信的问题, RAPI就是必不可少的工具. 从Windows CE1.0 开始就有了RAPI,用做远程配置Windows CE设备上的应用程序和资料.RAPI提供调用函数对 Windows CE设备上的如下领域进行远程访问 [1] : 2 z 文件系统 z 注册表 z 对象存储中数据库 2. Remote API使用中注意的问题 在使用RAPI 的过程中还有两个函数应该引起足够的注意,CeRapiInit() 和CeRapiUninit(),这两个函数在每次对Windows CE设备和PC的通信中都会用到,前者用与初 始化基本的通信层,并且会一直等到初始化成功,如果您的设备还没有连接,就可能导致死 循环;后者用于关闭所有与Windows CE的设备的连接,并卸载通信层.还有一点要注意的是 由于Windows CE是基于Unicode的操作系统,所以任何RAPI调用函数中的字符串都必须是 Unicode的,任何ANSI的字符串都可能会产生奇怪的效果. 3. RAPI实例分析 这个程序实现的主要目的就是实现PC和掌上电脑的通信,并且能够在PC中定位整个掌上 电脑中文件. 在应用RAPI之前首先要给出rapi.h和rapi.lib所在的路径 (在Directories中) , 如果您已经安装了Microsoft ActiveSync那么它们所在的路径是: /Windows CE Tools/WCE//Support/ActiveSync/inc /Windows CE Tools/WCE//Support/ActiveSync/inc 然后,在StdAfx.h中加入下面的两行: #include #pragma comment( lib, "rapi.lib" ) 这样就能够在程序中调用RAPI的接口函数了;还有一种方法就是找到rapi.dll所在的路径 (一般在System目录中) , 然后调用LoadLibrary()和GetProcAddress()函数. 需要注意的是, 不管使用那种方法都要确定rapi.dll文件已经存在. RAPI中用于定位文件位置的函数主要有 CeFindAllFiles(),CeFindFirstFiles()和CeFindNextFiles()这三个,后两个函数一般联 合使用,第一个函数能够得到指定路径下所有文件的信息.从理论上来讲,单独使用第一个 函数和使用后面两个函数都能够满足程序所需要的功能, 但在实际的使用中, 这两种方法所 用的时间却是非常的不一样, 特别是如果指定路径下的文件特别多的时候, 使用后面两种方 法也许会陷入一种"死机"的状态.因为在使用后两个函数的过程中,每查找一个文件的信 息就需要掌上电脑和桌面计算机进行一次通信, 而第一个函数只要一次通信就能够找到所有 文件的信息, 所以前者花费的时间自然也就较多. 程序首先调用CeFindAllFiles()函数得到 指定路径下所有文件的信息,然后依次列出所有的文件夹,在列出每一个文件夹的过程中, 再递归调用函数本身列出它所包含的文件夹,其代码如下: void CFileListDlg::FolderList(LPCTSTR Path, LPCTSTR File, HTREEITEM hti) { LPCE_FIND_DATA pFindDataArray = NULL; // 存储文件信息的结构体指针 3 DWORD dwFoundCount = 0; // 得到找到文件的个数 DWORD dwFileAttributeFlags = FAF_NAME|FAF_ATTRIBUTES; CString str1(Path),str2(Path); HTREEITEM htree = NULL; char szLineBuff[MAX_PATH]; // 保存文件名字为ANSI类型 str1+=File; BSTR bstr = str1.AllocSysString(); SysFreeString(bstr); // 字符串转换为Unicode类型 CeRapiInit();// 初始化通信层 BOOL bOk = CeFindAllFiles(bstr,dwFileAttributeFlags, &dwFoundCount, &pFindDataArray); // 查找所有文件的信息 for( int i = 0; i < (int)dwFoundCount; i++ ) // 列出所有文件 { WideCharToMultiByte(CP_ACP, 0,pFindDataArray[i].cFileName, -1, szLineBuff, sizeof(szLineBuff), NULL, NULL); // 文件名从Unicode转换为ANSI if(pFindDataArray[i].dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //16行 判断文件属性 { //如果文件类型是文件夹则列出 htree=m_tree.InsertItem(szLineBuff,2,3,hti); // 在树型控件中列出 CString strsub(str2); strsub+=szLineBuff; strsub+得到新的文件夹路径 FolderList(strsub,File,htree); // 递归调用函数本身 } } CeRapiUninit(); // 卸载通信层 } FolderList()的第一个参数是寻找文件的路径,第二个参数是文件的名字,一般用通配 符*.*(如果找所有文件) ,第三个参数是树型控件的句柄.例如FolderList("\\My Documents\hItemRoot),就是得到\\My Documents\\下所有的文件信息.首先应 该明确它是一个递归调用的函数, 因为我们不可能预测文件夹有几级; 其次需要注意的是我 们需要把指定文件路径的字符串从ANSI转换为Unicode,因为RAPI中所有函数的字符串参数 都是Unicode的;还有就是当我们从CE_FIND_DATA结构体中读取文件名字的时候,又需要把 它从Unicode转换为ANSI,因为最终显示的环境的还是在PC中.字符转换可能会是一个比较 麻烦的问题,但是还是必须要认真的对待,否则就会出现一些乱码的情况. 4 现在整个掌上电脑的文件体系已经在程序中列出来了, 当然现在显示出来的只是文件夹, 其实只要去掉上面程序中的第16行代码, 就能够列出指定文件夹下的所有文件, 也能够使程 序变得更加完善.这些都可以在我们具体应用的过程中灵活的掌握,这里就不再赘述了.下 面介绍关于数据库文件转换的开发和应用. Windows CE中的数据库形式一般有两种, 一种是Pocket Access, 另一种是SQL-Server for CE.Pocket Access虽然在Windows CE中存在,但是并没有提供它的应用程序接口,如果用 户要使用,就必须自己利用ADOCE在eVC中开发应用程序的接口.它的功能基本上PC机中的 Access一样,文件以".cdb"的类型在掌上电脑中存在.在掌上电脑和PC机建立通信之后, 就可以把这种".cdb"的文件类型转换为".mdb" ,也就是通常所用的Access数据库的文件 类型.DeviveToDesktop()函数就提供了这样的功能.具体用法如下: #define DB_PC "D:\\test.mdb" #define DB_PDA "\\My documents\\test.cdb" HINSTANCE gDllAdo = NULL; // 设置全局变量gDllAdo用于存储DLL句柄 typedef LRESULT PASCAL DVCTODSK(CString desktoplocn, CString tablelist, BOOL sync, int overwrite, CString devicelocn); DVCTODSK *DEVICETODESKTOP; // 指向DLL库中函数的指针 gDllAdo = LoadLibrary("C:\\Program Files\\Microsoft ActiveSync\\adofiltr.dll");//装载dll文件 if(NULL == gDllAdo) { AfxMessageBox ("打开C:\\Program Files\\Microsoft ActiveSync\\adofiltr.dll失败"); } CeRapiInit();// 初始化通信层 DEVICETODESKTOP = NULL; DEVICETODESKTOP = (DVCTODSK*)GetProcAddress(gDllAdo,"DEVICETODESKTOP"); if (NULL == DEVICETODESKTOP) { FreeLibrary(gDllAdo); // 获取函数指针失败 } HRESULT hRs = DEVICETODESKTOP( DB_PC, "", FALSE, TRUE, DB_PDA); //此处引号内是表名称,格式:"表..!表..", !表示只读拷贝.空则拷贝所有的表 if (0==hRs) { AfxMessageBox ("成功上传到服务器"); } 5 CeRapiUninit(); // 卸载通信层 利用上面的这段程序我们就能够把数据库文件成功的转换到PC中,需要注意的是在加载 DLL文件的过程中,确定使用的路径准确无误.还有就是当DEVICETODESKTOP()函数的第二 个参数的字符串为空的时候, 按照MSDN中的解释会默认转换数据库中所有的表, 可实际的情 况是,如果不事先调用CeRapiInit()来初始化通信层,转换总是不成功.当然如果能够在参 数所需的字符串中正确的给出需要转换的表的名字, CeRapiInit()函数的调用也就可有可无 了. 其实利用RAPI强大的功能在不转换数据库文件的情况下, 我们也可以在PC中对掌上电脑 的数据库进行各种各样的操作. 4. 结束语 利用RAPI我们已经实现了对掌上电脑文件体系的访问和数据库文件的转换, 由于Windows CE中也没有专门的对注册表进行编辑的应用程序,我们还可以利用它对注册表进行访问. RAPI作为Windows CE中专门用于和PC通信的部分,这里只对其中的一方面做了比较详细的介 绍和应用. 参考文献 [1] CHRIS MUENCH,Windows CE权威指南,精英科技译,北京:中国电力出版社,2001 [2]Microsoft,http://whidbey.msdn.microsoft.com/library/default.asp?url=/library /en-us/wceactsy/html/cerefrapifunctions.asp [OL] [3]David J.Kruglinski ,Scot Wingo,Visual C++ 6.0技术内幕,希望图书创作室译,北京 希望电子出版社,2001 [4]田东风,Windows CE应用程序设计,机械工业出版社,2003 基金项目:国家"863"计划资助项目(2003AA209080) 作者简介: 田凯,男,1982-,硕士研究生,主要研究方向为嵌入式系统. Kai Tian,male,1982-,master, research direction is embedded system. 孟志军,男,1976-,博士研究生,主要研方向为嵌入式系统及农机变量控制技术. ZhiJun Meng,male,1976-,doctor,research direction is embedded system and variable control for agriculture machine.在 王武宏,男,1962-,博士研究生,主要研究方向为嵌入式车载系统. WuHong Wang,male,1962-,doctor,research direction is embedded system for vehicle. 单位:国家农业信息化工程技术研究中心 联系方式:北京市2449信箱26分箱(田凯收) ,100089,tk.snow@tom.com 评语:期刊内容翔实,研究范围广泛,非常有参考价值
  • 下载地址 (推荐使用迅雷下载地址,速度快,支持断点续传)
  • 免费下载 PDF格式下载
  • 您可能感兴趣的
  • loadlibrary失败解决  loadlibrary失败127  loadlibrary失败原因  loadlibrary失败126  loadlibrarydll失败  loadlibrary失败api  loadlibrary  loadlibrary126  loadlibraryfailed  systemloadlibrary