RAPI全写为Remote Application Interface, 就是PC端调用这组API, 通过ActiveSync来操作TARGET端WindowsCE作业. 这个功能估计以后在WINCE或WIN MOBILE的应用上会用到许多
我今天修改了同事留下的Updateboot.exe的代码, 改进蓝牙读写的模块. 这个地方我们用到了RAPI, 看一下他们在程序中初始化RAPI的做法
HRESULT hRapiResult;
hRapiResult = CeRapiInit();
if(hRapiResult != S_OK)
{
m_ValueEdit.SetWindowText((LPCTSTR)"初始化RAPI失败");
return;
}
看起来是平淡无奇, 实际上单步一下就可以发现运行到CeRapiInit()时, 程序就BLOCK在这里了,死活走不下去, 并没有达到 if(hRapiResult != S_OK)的预期目的. 我查了一下CeRapiInit()的说明:
A call to CeRapiInit does not return until the connection is made, an error occurs, or another thread calls CeRapiUninit.
也就是说像我现在并没有把板子和PC相连并启动ACTIVE SYNC时, 这个CeRapiInit()是肯定赖着不走了, 程序会死在这里. (鄙视一下谁写的代码,这个坑好大啊) 因此想到了重新创立个等待进程调用CeRapiUninit来干掉它. 不过这样做显然不厚道, 创立进程需要占用更多的内存. 所以用了上句说明的下半段:
The CeRapiInitEx function does not block the calling thread. Instead, it uses an event to signal when initialization is complete.
建立个事件, 用WaitForSingleObject来等他, 超时就BYEBYE了. 贡献自己写的如下代码, 以后RAPI INIT可以参考
BOOL RapiInitialzation()
{
RAPIINIT struRapiInit; //这个是CeRapiInitEx函数要求的入口参数
DWORD dwWaitResult = 0; //等待初始化完成事件的变量
HRESULT hRapiResult = NULL; //CeRapiInitEx的返回HANDLE
if ( m_bRapiInitFlag == FALSE ) //全局的一个FLAG,如果初始化过就不再重复了
{
struRapiInit.cbSize = sizeof(RAPIINIT); //填满该结构体仅有的三个成员
struRapiInit.hrRapiInit = NULL; //明知是输出参数也顺手填一下, 我以前吃过亏, 惊弓之鸟
struRapiInit.heRapiInit = NULL;
hRapiResult = CeRapiInitEx(&struRapiInit); //关键点
m_ValueEdit.SetWindowText((LPCTSTR)"Wait 2 second for RapiInit"); //后面2秒程序要顿一下了, 得告诉用户. m_ValutEdit和对话框里一个IDC_STATIC关联了.
dwWaitResult = WaitForSingleObject(struRapiInit.heRapiInit, 2000); //关键点
if( hRapiResult == S_OK &&
struRapiInit.hrRapiInit == S_OK &&
dwWaitResult != WAIT_TIMEOUT) //保守起见, 三个返回值都判断
{
m_bRapiInitFlag = TRUE;
return TRUE;
}
else
{
m_ValueEdit.SetWindowText((LPCTSTR)"The initialization of RAPI falied, you need to install an ActiveSync or connect the IPTV to PC"); //一般是没连接导致, 当然也可能用户没装ActiveSync
return FALSE;
}
}
else
{
m_bRapiInitFlag = TRUE;
return TRUE;
}
}
分享到:
相关推荐
为了建立与移动设备的连接,你需要创建一个`Rapi`对象并初始化它。初始化过程通常包括设置设备的连接路径和验证身份。例如: ```csharp using Microsoft.Rapi; using Microsoft.WindowsMobile.PocketOutlook; // ...
百度地图JavaScript API初始化地图创建标注
在“Serial Port API Sample 1.1”中,开发者可以学习到如何初始化串口、打开和关闭串口、设置串口参数以及读写数据的完整流程。 1. **串口初始化**:首先,我们需要创建一个串口对象,这通常涉及指定串口名称(如...
CODE128算法需要将ASCII字符转换为条码对应的二进制码,因此需要熟悉位运算和字符编码。 - C语言的内存管理和控制流程(如循环、条件语句)对于算法实现至关重要。 3. **CODE128编码** - 编码过程包括选择合适的...
1. **初始化Direct3D**:设置设备类型、呈现目标和窗口模式,创建Direct3D设备实例。 2. **场景设置**:设置视口、投影和模型观察变换,理解坐标系统和世界空间。 3. **绘制几何体**:使用顶点缓冲区或索引缓冲区...
本文档详细介绍了DRM平台的初始化流程,特别是其子模块GEM(Graphics Execution Manager)和KMS(Kernel Mode Setting)组件中的CRTC(CRT Controller)、ENCODER和CONNECTOR等关键结构。 1. DRM平台概览 DRM作为...
在"sample_venc.c"中,我们可以期待看到初始化VENC实例、设置编码参数、输入原始视频帧、获取编码结果以及关闭编码器的示例代码。 3. **海思VENC**:海思的视频编码器具有高效的编码算法,能够提供高质量的编码输出...
4. 初始化当前像素中心点的x和y坐标,以及商q和余数r。 5. 使用循环结构,每次迭代: - 如果r为0,向右移动一像素并更新y坐标。 - 更新x坐标,无论r是否为0。 - 更新r = (2 * r - q) % dx。 6. 绘制当前像素位置...
它显示了如何初始化 StepCounter API 接口和显示当前步骤计数器值(Step Counter values)。 标签:Hello 分享 window._bd_share_config = { ...
学习STM32的外设初始化和配置,不仅需要理解每个外设的功能和操作原理,还需要熟悉HAL库或LL库的API函数用法,它们提供了便捷的方式来设置和控制外设。同时,了解STM32的寄存器结构和编程模型也是必要的,这对于深入...
area_name|area_code|parent_area_code|area_level 例如: 中国|1||0 黑龙江省|2|1|1 大兴安岭地区|38|2|2 黑河市|39|2|2 伊春市|40|2|2 齐齐哈尔市|41|2|2 佳木斯市|42|2|2 鹤岗市|43|2|2 绥化市|44|2|2 双鸭山市|...
PLC_API_Sample.tszip和TrigonometryMLP.xml这三个文件,学习者可以了解并实践如何在TwinCAT环境中集成机器学习算法、执行复杂的数学运算,并配置神经网络模型,从而提升自动化系统的智能性和效率。对于想要深入理解...
- Triple DES算法的库函数,也包括加密和解密的初始化、附加数据处理和结束处理函数。 - AES算法的库函数,针对不同的操作模式(ECB、CBC、CTR)都有相应的初始化、附加处理和结束处理函数。 例如,DES算法在ECB...
树枝分形算法,系统处理,取时间名称,初始化图片,初始化背景,初始化树信息,初始化树数据,刷新显示窗体,下个分枝,循环控制,画花朵,改变树产品,改变时钟状态,错误处理,系统参数初始化,参数分析,启动API时钟,关闭API时钟,...
1. **初始化和配置**:开发者需要通过SDK初始化Codec Engine,并设置所需的参数,如分辨率、帧率、编码标准等。这些函数通常包括CE_Init()、CE_SetConfig()等。 2. **数据处理**:SDK提供了将输入数据送入Codec ...
安装要安装fastapi-code-generator : $ pip install fastapi-code-generator用法fastapi-code-generator命令: Usage: fastapi-codegen [OPTIONS]Options: -i, --input FILENAME [required] -o, --output PATH ...
为了在网页中使用,你需要在HTML中引入`lib/codemirror.js`和其他必要的模式文件,然后通过JavaScript来初始化编辑器并配置所需的选项。 在实际开发中,CodeMirror常被用于在线编程教育平台、代码预览工具、Web应用...
算法同样从圆心开始,初始化错误项e为-1,x和y的增量dx和dy分别为2r和2r-1,其中r为半径。每一步,如果e + dx ,则向右移动一个像素,e += dy;否则,向下移动一个像素,e += (dx+dy)。这个过程直到x和y达到半径r。 ...
CODE128Auto通常会自动选择最佳子集,以达到数据传输效率最大化。 - 每个CODE128条码以起始字符开始,以终止字符结束,中间包括数据字符和可能的检查字符,以确保数据的准确性。 2. **条码生成算法**: - 在编程...
7. **API设计**: 为了方便使用,C源代码通常会提供一个用户友好的API,包括初始化、更新(absorb)、最终化(squeeze)和获取哈希值等方法。 8. **Optimization**: 为了提高性能,可能会有优化版本的SHA3实现,比如...