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函数。
调用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字段。
结束所有必要的RAPI调用时,你应该调用下面这个函数来进行清除:
HRESULT CeRapiUninit(void);
这个函数很好地关闭与远程设备地RAPI通信。如果RAPI会话没有被初始化
CeRapiUninit将返回E_FAIL
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 |
编写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(); 进行清楚。
下面的这张截图就是把CE端的“/battery.png” 复制到 PC上的“c:/test.png”文件中。