天天看點

實作 pc與Windows mobile通訊方法之一

實作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);