实现 pc与Windows mobile通讯方法之一

来源:互联网 发布:js的indexof 编辑:程序博客网 时间:2024/04/29 20:49

实现windows mobile 和pc机通讯,大家熟知的方法就是 CeRapiInvoke()方式;

在PC机端使用 CeRapiInvoke()调用windows mobile 端的一个dll;

比如说,windows mobile 方的dll 名字是 Test.dll

 

 

pc机端 调用方式:

PBYTEpByOut;

DWORDdwOut;

IRAPIStream*pIRAPIStream = NULL; 

unsigned longdwTem = 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);

原创粉丝点击