1.RAPI概述
Windows CE中有了RAPI以后,PC应用程序就能远程管理Windows CE设备。导出函数将处理文件系统、注册表和数据库以及用于查询系统配置的函数。大多数RAPI是Windows CE API函数中的副本,只有少数的函数扩展了API。
RAPI函数被列在Windows CE API 参考中,但是将有PC应用程序来调用而不是由Widows CE应用程序调用。在函数的名称都有前缀Ce来与他们的Window CE的副本进行区分;例如:Windows CE中的函数GetStoreInformation将在该函数的RAPI版本中称为CeGetStoreInformation。在Windows CE应用程序将不会调用RAPI函数。
2.初始化RAPI
调用RAPI函数之前,你必须调用函数CeRapiInit或CeRapiInitEx来初始化RAPI库。这两个函数的区别在于CeRapiInit会阻塞(等待与Windows CE设备连接成功),而CeRapiInitEx不会等待连接成功。
这两个函数的原形。
HRESULT CeRapiIni(void);
HRESULT CeRapiInitEx(RAPIINIT *pRapiInit);
typedef struct _RAPIINIT
{
DWORD cbSize;
HANDLE heRapiInit;
STDAPI hrRapiInit;
} RAPIINIT;
在调用CeRapiInitEx之前,必须填写cbSize字段。
3.结束RAPI会话
结束所有必要的RAPI调用时,你应该调用下面这个函数来进行清除:
HRESULT CeRapiUninit(void);
这个函数很好地关闭与远程设备地RAPI通信。如果RAPI会话没有被初始化
CeRapiUninit将返回E_FAIL
4.预定义的RAPI函数
RAPI服务包括很多预定义的RAPI函数,这些在连接时,PC端复制Windows CE函数。因此,正如GetStoreInformation将把对象存储哭得大小和空间返回到Windows CE程序,CeGetStoreInformation将把关于连接的Windows CE设备的相同信息返回到基于PC的应用程序。
4.1 RAPI系统信息函数
大多数函数都是Windows CE函数的副本,除了CeGetPassWord和CeRapiInvoke
系统信息函数
函数
描述
CeGetSystemInfo
返回当前系统信息
CeGetSystemMetrics
获取Windows元素的尺寸和系统设置
CeGetVersionEx
获取当前运行的操作系统版本的扩展信息
CeGetSystemPowerStatusEx
获取电池状态
CeGlobalMemoryStatus
获取系统物理内存和虚拟内存信息
CeGetStoreInformation
获取存储器信息并填入STORE_INFORMATION结构
4.2 RAPI文件和目录管理函数
下面的列表显示的是RAPI文件管理函数,这个列表说明几乎所有可用于Windows CE应用程序的文件函数都可以用于基于PC的程序。
函数
描述
CeCopyFile
复制文件
CeCreateDirectory
创建目录
CeCreateFile
创建,打开文件、管道、通讯资源、磁盘设备或者控制台。返回一个句柄用来访问对象。
CeDeleteFile
删除文件
CeFindAllFiles
从指定的Windows CE目录中获取所有文件和目录的信息,并且复制到一个包含CE_FIND_DATA结构的数组中
CeFindFirstFile
在目录中查找匹配给定文件名的一个文件
CeFindClose
关闭指定的查找句柄,CeFindFirstFile和CeFindNextFile 函数用这个句柄查找文件
CeFindNextFile
从上一次访问的CeFindFirstFile继续查找文件
CeGetFileAttributes
返回指定文件或目录的属性
CeGetFileSize
获取指定文件的字节大小
CeGetFileTime
获取文件创建日期时间,最后访问日期时间和最后修改日期时间
CeMoveFile
移动(重命名)一个文件或者目录
CeReadFile
从文件指针处读取文件数据
CeWriteFile
从文件指针处写入文件数据
表内有一个新函数CeFindAllFiles,它对Windows CE 应用程序不可用。
原型:
BOOL CeFindAllFiles (LPCWSTR szPath, DWORD dwFlags,
LPDWORD lpdwFoundCount,
LPLPCE_FIND_DATA ppFindDataArray);
设计CeFindAllFiles 是为了增强性能,只需调用它一次就能返回给定目录的所有文件,而不需要使用CeFindFirstFile和CeFindNextFile来重复RAPI的调用。
具体参数参考SDK…
4.3 RAPI数据库函数
下面的列表中显示的是RAPI数据库函数。这些函数模拟了在Windows CE中找到的扩展数据库API
数据库函数
CeCreateDatabase
CeOpenDatabaseEx
CeCreateDatabaseEx
CeReadRecordProps
CeDeleteDatabase
CeReadRecordPropsEx
CeDeleteDatabaseEx
CeSeekDatabase
CeDeleteRecord
CeSetDatabaseInfo
CeFindFirstDatabase
CeSetDatabaseInfoEx
CeFindFirstDatabaseEx
CeWriteRecordProps
CeFindNextDatabase
CeMountDBVol
CeFindNextDatabaseEx
CeUnmountDBVol
CeOidGetInfo
CeEnumDBVolumes
CeOidGetInfoEx
CeFindAllDatabases
CeOpenDatabase
几乎所有的数据库函数都有Windows CE副本。唯一的例外的是新函数CeCreateDatabase
像CeFindAllFiles一样,设计这个函数也是为了增强性能。
函数原型:
BOOL CeFindAllDatabases (DWORD dwDbaseType, WORD wFlags,
LPWORD cFindData,
LPLPCEDB_FIND_DATA ppFindData);
具体参数参考SDK…
RAPI注册表管理函数
这些函数与它们的Windows CE副本的工作方式一样,但是,要记住所有的字符串都是Unicode格式。
4.4 其他的API函数
可以说Windows CE上的功能,通过RAPI都能实现,我在这里不可能不一一列举了。
电量显示函数
STDAPI_(BOOL) CeGetSystemPowerStatusEx
(
PSYSTEM_POWER_STATUS_EX pstatus,
BOOL fUpdate
);
创建进程,就是可以打开CE上的应用程序
CeCreateProcess
窗体管理函数
窗体管理函数
CeGetWindow
CeGetWindowText
CeGetWindowLong
CeGetClassName
5.Pget例子程序
编写RAPI应用程序需要加RAPI.h 和RAPI.lib
在EVC4.0下设置方法:
[Tools]\[Options…]\[Directories]进行设置他们的目录。
在VSS2005下的设置方法:
[Tools]\[Options]\[Projects and Solutions][VC++ Directories ]
下面时.h文件lib的存放目录。
C:\Program Files\Windows CE Tools\wce420\POCKET PC 2003\Activesync\Inc
C:\Program Files\Windows CE Tools\wce420\POCKET PC 2003\Activesync\Lib
C:\Program Files\Windows CE Tools\wce500\Windows Mobile 5.0 Pocket PC SDK\Activesync\Inc
C:\Program Files\Windows CE Tools\wce500\Windows Mobile 5.0 Pocket PC SDK\Activesync\Lib
这个程序是SDK的例子代码
具体路径
PPC2003 和 WM5 PPC
C:\Program Files\Windows CE Tools\wce420\POCKET PC 2003\Samples\Win32\Rapi\Pget
C:\Program Files\Windows CE Tools\wce500\Windows Mobile 5.0 Pocket PC SDK\Samples\CPP\Win32\Rapi\Pget
WM5 SP
C:\Program Files\Windows CE Tools\wce500\Windows Mobile 5.0 Smartphone SDK\Samples\CPP\Win32\Rapi\Pget
这个程序是从小机器上复制文件到PC的控制台应用程序。
代码部分就不具体写出了。只说明一下流程
复制文件的命令是;
Pget <CE源文件> <PC目的文件>
1. 用CeRapiInit()进行初始化。
2. CeFindFirstFile()来判断CE端是否存在该文件。
3. CeCreateFile()来打开CE端的文件。
4. CreateFile()来创建PC端的复制到的文件。
5. CeReadFile()把CE的文件读到缓存区里。
6. WriteFile()把缓存区里的数据保存到PC端。
7. CeCloseHandle()和CloseHandle()关闭CE和PC上的文件句柄。
8. 最后调用CeRapiUninit(); 进行清楚。