實作windows mobile 和pc機通訊,大家熟知的方法就是 CeRapiInvoke()方式;
在PC機端使用 CeRapiInvoke()調用windows mobile 端的一個dll;
比如說,windows mobile 方的dll 名字是 Test.dll
pc機端 調用方式:
PBYTE pByOut;
DWORD dwOut;
IRAPIStream *pIRAPIStream = NULL;
unsigned long dwTem = sizeof(SHFILEINFO);
PC2WM_GETINFO stGetInfo; // 自己定義的結構,windows mobile/pc機端需要一緻(本人實驗傳遞不同的資料然後根據結構解析,作出不同功能調用)
stGetInfo.iPackageType = GET_RECEIVE_INFO; // 目前操作的行為
stGetInfo.iSmsBoxType = m_iCurrentBox; // 目前操作的函數
BYTE strOrder[PC2WM_GETINFO]
memset( strOrder, 0, sizeof(strOrder));
memcpy( strOrder, &stGetSms, sizeof(PC2WM_GETINFO));
// 注意這裡 Test.dll在Windows mobile端的路徑
HRESULT hr = CeRapiInvoke( L"//Test.dll", L"CeRemoteControl", sizeof(strOrder), strOrder, &dwOut, &pByOut, &pIRAPIStream, 0);
BYTE strStream[10];
int iSmsCount= 0;
if(S_OK == hr)
{
pIRAPIStream->Read( &strStream, sizeof(int), &dwTem);
memcpy( &iSmsCount, &strStream, sizeof(int));
}
windows mobile 端收到這個流資訊以後,根據不同的要求傳回 不通的資訊 ;
然後将自己的資料寫入流中,
pStream->Write( &stDetails, sizeof(DETAILS), &ulWritten);
PC機端就可以收到傳遞過來的資料了,
這方面的資料網上非常多,大家可以在 google ,baidu 輸入 CeRapiInvoke()搜尋,
但是當代碼寫好以後,講手機端的dll拷貝到對應路徑,啟動手機端調用程式,你會發現你的調用代碼沒有任何反應?
我遇到過這樣的問題,研究了好久,終于找到了解決方法;
Windows mobile的系統資料庫中,禁止運作他認為不安全的程式,是以我的調用沒有任何反應,那麼這個問題怎麼解決呢?
網上介紹了很多種方法,但是我基本上都沒有實驗成功,
後來我找到了一種可以修改系統資料庫的安全屬性,做到 CeRapiInvoke()函數正常調用。
做法是,首先做一個 可執行的 手機端可執行程式,Modify.exe先修改手機的系統資料庫資訊,
然後我們的CeRapiInvoke()就可以正常調用了
修改系統資料庫資訊代碼如下:
HKEY hSubKey;
RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Security//Policies//Policies", 0, KEY_SET_VALUE, &hSubKey);
DWORD dwType = REG_DWORD;
DWORD dwData = 1;
int nRet = GetLastError();
HRESULT lRetValue = RegSetValueEx(hSubKey,L"00001001" , NULL, dwType,(LPBYTE)(&dwData), sizeof(DWORD));
nRet = GetLastError();
nRet = RegCloseKey(hSubKey);