[導(dǎo)讀]先來 RAPI 概述Windows CE 有了 RAPI 以后,PC 應(yīng)用程序就能遠程管理 Windows CE 設(shè)備。導(dǎo)出函數(shù)將處理文件系統(tǒng)、注冊表和數(shù)據(jù)庫以及用于查詢系統(tǒng)配置的函數(shù)。大多數(shù) RAP
先來 RAPI 概述
Windows CE 有了 RAPI 以后,PC 應(yīng)用程序就能遠程管理 Windows CE 設(shè)備。
導(dǎo)出函數(shù)將處理文件系統(tǒng)、注冊表和數(shù)據(jù)庫以及用于查詢系統(tǒng)配置的函數(shù)。
大多數(shù) RAPI 是 Windows CE API 函數(shù)中的副本,只有少數(shù)的函數(shù)擴展了 API。
RAPI 函數(shù)被列在 Windows CE API 參考中,但是將有 PC 應(yīng)用程序來調(diào)用而不是由 Widows CE 應(yīng)用程序調(diào)用。
在函數(shù)的名稱都有前綴 Ce 來與他們的 Window CE 的副本進行區(qū)分;
例如:Windows CE 中的函數(shù) GetStoreInformation 將在該函數(shù)的 RAPI 版本中稱為 CeGetStoreInformation。
在 Windows CE 應(yīng)用程序?qū)⒉粫{(diào)用 RAPI 函數(shù)。
知道大家不想看文字,直接上示例(功能:復(fù)制文件到設(shè)備上)代碼:
RAPI 被封裝為一個類,先看頭文件。
CeRAPI.h?
//?CeRAPI.h:?interface?for?the?CeRAPI?class.
//
//////////////////////////////////////////////////////////////////////
#if?!defined(AFX_VOGUERAPI_H__10D13979_C6F2_4922_A4D7_B105644F969F__INCLUDED_)
#define?AFX_VOGUERAPI_H__10D13979_C6F2_4922_A4D7_B105644F969F__INCLUDED_
#if?_MSC_VER?>?1000
#pragma?once
#endif?//?_MSC_VER?>?1000
#define?BUFFER_SIZE?10240
typedef?struct?_RAPIINIT
{?
DWORD?cbSize;?
HANDLE?heRapiInit;?
HRESULT?hrRapiInit;?
}
RAPIINIT;
typedef?struct?_CE_FIND_DATA?{
????DWORD????dwFileAttributes;
????FILETIME?ftCreationTime;
????FILETIME?ftLastAccessTime;
????FILETIME?ftLastWriteTime;
????DWORD????nFileSizeHigh;
????DWORD????nFileSizeLow;
????DWORD????dwOID;
????WCHAR????cFileName[MAX_PATH];
}?CE_FIND_DATA,?*LPCE_FIND_DATA;
class?CCeRAPI??
{
public:
HINSTANCE?hInst;
typedef?HANDLE?(FAR?PASCAL?*?pfnFunc0)(LPCWSTR,?DWORD,?DWORD,?LPSECURITY_ATTRIBUTES,?DWORD,?DWORD,?HANDLE);
typedef?BOOL???(FAR?PASCAL?*?pfnFunc1)(HANDLE,?LPCVOID,?DWORD,?LPDWORD,?LPOVERLAPPED);
typedef?BOOL???(FAR?PASCAL?*?pfnFunc2)(HANDLE);
typedef?HANDLE?(FAR?PASCAL?*?pfnFunc3)(LPCWSTR,?LPCE_FIND_DATA);
typedef?DWORD??(FAR?PASCAL?*?pfnFunc4)(HANDLE,?LPDWORD);
typedef?BOOL???(FAR?PASCAL?*?pfnFunc5)(HANDLE,?LPVOID,?DWORD,?LPDWORD,?LPOVERLAPPED);
typedef?BOOL???(FAR?PASCAL?*?pfnFunc6)(HANDLE,?LPCE_FIND_DATA);
typedef?BOOL???(FAR?PASCAL?*?pfnFunc7)(LPCWSTR,?LPSECURITY_ATTRIBUTES);
typedef?BOOL???(FAR?PASCAL?*?pfnFunc8)(LPCWSTR,?LPCWSTR,?LPSECURITY_ATTRIBUTES,?LPSECURITY_ATTRIBUTES,?BOOL,?DWORD,?LPVOID,?LPWSTR,?LPSTARTUPINFO,?LPPROCESS_INFORMATION);?
typedef?VOID???(FAR?PASCAL?*?pfnFunc9)(LPSYSTEM_INFO);
typedef?HRESULT?(FAR?PASCAL?*pfnFnucA)(RAPIINIT*);
typedef?BOOL?(FAR?PASCAL?*pfnFuncB)(LPCWSTR,LPCWSTR,BOOL);
typedef?DWORD?(FAR?PASCAL?*pfnFuncC)();
typedef?HRESULT?(FAR?PASCAL?*pfnFuncD)();
pfnFunc0?CeCreateFile;
pfnFunc1?CeWriteFile;
pfnFunc2?CeCloseHandle;
pfnFunc3?CeFindFirstFile;
pfnFunc4?CeGetFileSize;
pfnFunc5?CeReadFile;
pfnFunc6?CeFindNextFile;
pfnFunc7?CeCreateDirectory;
pfnFunc8?CeCreateProcess;?
pfnFunc9?CeGetSystemInfo;
FARPROC??CeRapiUninit;
//FARPROC??CeRapiInit;
pfnFuncB?CeCopyFile;
pfnFuncC?CeGetLastError;
pfnFuncD?CeRapiGetError;
//Leo?Add
pfnFnucA?CeRapiInitEx;
BOOL?m_bRapiInitFlag;
BOOL?RapiConnectDevice();
BOOL?CopyFiletoWinCE(CString?strFileNamePC,?CString?strFileNamePPC);
BOOL?CCeRAPI::CopyFiletoPC(CString?csCEFilename,CString?csPCFilename);
BOOL?InitRapi();
// CString?GetCStringFromFile(CString?strFileName);
CCeRAPI();
virtual?~CCeRAPI();
};
#endif?//?!defined(AFX_VOGUERAPI_H__10D13979_C6F2_4922_A4D7_B105644F969F__INCLUDED_)
類的實現(xiàn)文件:CeRAPI.cpp?
//?CeRAPI.cpp:?implementation?of?the?CeRAPI?class.
//
//////////////////////////////////////////////////////////////////////
#include?"stdafx.h"
#include?"RapiTest.h"
#include?"CeRAPI.h"
#ifdef?_DEBUG
#undef?THIS_FILE
static?char?THIS_FILE[]=__FILE__;
#define?new?DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
//?Construction/Destruction
//////////////////////////////////////////////////////////////////////
CCeRAPI::CCeRAPI()?
{
m_bRapiInitFlag?=?FALSE;
}
CCeRAPI::~CCeRAPI()
{
}
BOOL?CCeRAPI::InitRapi()
{
LPTSTR?pDllPath?=?new?TCHAR[MAX_PATH?+?10];
GetSystemDirectory(pDllPath,?MAX_PATH);
CString?strDllPathName(pDllPath);
strDllPathName?+=?"\Rapi.dll";
TRACE("%sn",strDllPathName); //C:WINDOWSsystem32rapi.dll
hInst?=?LoadLibrary(strDllPathName);
if(hInst)
{
//CeRapiInit?=?(FARPROC)?GetProcAddress(hInst,?"CeRapiInit");
CeRapiInitEx?=?(pfnFnucA)?GetProcAddress(hInst,?"CeRapiInitEx");
CeRapiUninit?=?(FARPROC)?GetProcAddress(hInst,?"CeRapiUninit");
CeCreateFile?=?(pfnFunc0)GetProcAddress(hInst,?"CeCreateFile");
CeWriteFile?=?(pfnFunc1)GetProcAddress(hInst,?"CeWriteFile");
CeCloseHandle?=?(pfnFunc2)GetProcAddress(hInst,?"CeCloseHandle");
CeFindFirstFile?=?(pfnFunc3)GetProcAddress(hInst,?"CeFindFirstFile");
CeGetFileSize?=?(pfnFunc4)GetProcAddress(hInst,?"CeGetFileSize");
CeReadFile?=?(pfnFunc5)GetProcAddress(hInst,?"CeReadFile");
CeFindNextFile?=?(pfnFunc6)GetProcAddress(hInst,?"CeFindNextFile");
CeCreateDirectory?=?(pfnFunc7)GetProcAddress(hInst,?"CeCreateDirectory");
CeCreateProcess?=?(pfnFunc8)GetProcAddress(hInst,?"CeCreateProcess");
CeGetSystemInfo?=?(pfnFunc9)GetProcAddress(hInst,?"CeGetSystemInfo");
CeCopyFile?=?(pfnFuncB)GetProcAddress(hInst,?"CeCopyFile");
CeGetLastError?=?(pfnFuncC)GetProcAddress(hInst,?"CeGetLastError");
CeRapiGetError?=?(pfnFuncD)GetProcAddress(hInst,?"CeRapiGetError");
return?TRUE;
}
else
{
FreeLibrary(hInst);
return?FALSE;
}
return?FALSE;
}
BOOL?CCeRAPI::CopyFiletoPC(CString?csCEFilename,CString?csPCFilename)
{
HANDLE?hCEFile;
DWORD?dwFileSize?=?0;
int?iFileBlockSize?=?0;
DWORD?dwBytes?=?0;
char?cBlockSize[BUFFER_SIZE];
int?i?=?0;
DWORD?dwSizeRet?=?0?;
CFile?PCFile;
BSTR?bstr?=?csCEFilename.AllocSysString();??
SysFreeString(bstr);
hCEFile?=?CeCreateFile(bstr,?GENERIC_READ,?0,?NULL,
????OPEN_EXISTING,?FILE_ATTRIBUTE_NORMAL,?NULL);
if(INVALID_HANDLE_VALUE?==?hCEFile)
{
TRACE("==Fail?to?open?device?file:%dn",GetLastError());
return?FALSE;
}
dwSizeRet?=?CeGetFileSize(hCEFile,&dwFileSize);
TRACE("==Read?file?size?return?value:%dn",dwSizeRet);
dwFileSize?=?dwSizeRet?+?(dwFileSize?<<?32);
iFileBlockSize?=?dwFileSize?/?BUFFER_SIZE;
PCFile.Open(csPCFilename,CFile::modeReadWrite?|?CFile::typeBinary?|?CFile::modeCreate);
for(i?=?0;i?<?iFileBlockSize;i++)
{
memset(cBlockSize,0,sizeof(char)?*?BUFFER_SIZE);
CeReadFile(hCEFile,cBlockSize,BUFFER_SIZE,&dwBytes,NULL);
PCFile.Write(cBlockSize,BUFFER_SIZE);
}
if(0?!=?dwFileSize?%?BUFFER_SIZE)
{
memset(cBlockSize,0,sizeof(char)?*?BUFFER_SIZE);
CeReadFile(hCEFile,cBlockSize,dwFileSize?%?BUFFER_SIZE,&dwBytes,NULL);
PCFile.Write(cBlockSize,dwFileSize?%?BUFFER_SIZE);
}
CeCloseHandle(hCEFile);
PCFile.Close();
return?TRUE;
}
BOOL?CCeRAPI::CopyFiletoWinCE(CString?csPCFilename,?CString?csCEFilename)
{
CFile?PCFile;
HANDLE?hCEFile;
char?cTemp[BUFFER_SIZE];
DWORD?dwBytes?=?0;
int?iFileLen?=?0;
int?iFileNum?=?0;
int?i?=?0;
PCFile.Open(csPCFilename,?CFile::modeRead?|CFile::typeBinary);
iFileLen?=?PCFile.GetLength();?
iFileNum?=?iFileLen?/?BUFFER_SIZE;
BSTR?bstr?=?csCEFilename.AllocSysString();?
SysFreeString(bstr);
hCEFile?=?CeCreateFile(bstr,?GENERIC_READ?|?GENERIC_WRITE,?0,?NULL,
????OPEN_ALWAYS,?FILE_ATTRIBUTE_NORMAL,?NULL);
if(INVALID_HANDLE_VALUE?==?hCEFile) //文件打開失敗
{
return?FALSE;
}
for(i?=?0;i?<?iFileNum;i++)
{
memset(cTemp,0,sizeof(char)?*?BUFFER_SIZE);
if(PCFile.Read(cTemp,?BUFFER_SIZE)?>=?1)
{
CeWriteFile(hCEFile,?cTemp,?BUFFER_SIZE,?&dwBytes,?NULL);
}
}
if(0?!=?iFileLen?%?BUFFER_SIZE)
{
memset(cTemp,0,sizeof(char)?*?BUFFER_SIZE);
if(PCFile.Read(cTemp,?iFileLen?%?BUFFER_SIZE)?>=?1)
{
CeWriteFile(hCEFile,?cTemp,?iFileLen?%?BUFFER_SIZE,?&dwBytes,?NULL);
}
}
CeCloseHandle(hCEFile);
PCFile.Close();
return?TRUE;
}
//?CString?CVogueRAPI::GetCStringFromFile(CString?strFileName)
//?{
//? CString?strOut;
//? LPSTR?pText?=?NULL;
//? int?iLen;
//? CFile?f;
//? if?(f.Open(strFileName,?CFile::modeReadWrite))
//? {
//? iLen?=?f.GetLength();
//? pText?=?new?char[iLen?+?1];
//? f.Read(pText,?iLen);
//? pText[iLen]?=?'
