• 手机探索者开发实录—MobileX插件


    手机探索者开发实录—MobileX插件

    转载时请注明出处和作者联系方式
    作者联系方式:李先静 <xianjimli at hotmail dot com>

    手机探索者的传输通道已经打开了,在broncho平台上的实现也已经做好了。但还有三个任务有待完成:VNC客户端,Windows资源管理器扩展和Linux资源管理器扩展。考虑到时间紧迫和客户的要求,我们先给Mobilex开发一个插件,其它功能作为下一个阶段性目标再现实吧。

    MobileX算不上一款优秀的PC工具,不过还好它提供了COM接口的扩展。这个接口的IDL描述如下:



    1.     [
    2.         object,
    3.         uuid(F839A534-A500-4F67-A1F9-23F5D973288D),
    4.         dual,
    5.         helpstring("IExch Interface"),
    6.         pointer_default(unique)
    7.     ]
    8.     interface IExch : IDispatch
    9.     {
    10.         [id(1), helpstring("method SetupDevice")] HRESULT SetupDevice(int hMsgWnd, BSTR DeviceFile, BOOL *bResult);
    11.         [id(2), helpstring("method Write")] HRESULT Write(BSTR Path, BSTR XmlFileName, BOOL *bResult);
    12.         [id(3), helpstring("method Read")] HRESULT Read(BSTR Path, BSTR XmlFileName, BOOL *bResult);
    13.         [id(4), helpstring("method Kill")] HRESULT Kill();
    14.     };
    15. [
    16.     uuid(68F2B7EA-1F80-4538-AFAD-ACCC9A584C3D),
    17.     version(1.0),
    18.     helpstring("Mobile Explorer plugin for MobileX 1.0 Type Library")
    19. ]


    它要求实现四个函数:
    SetupDevice 用来建立与设备之间的连接,hMsgWnd是一个比较重要的参数,通常用它来与MobileX通信,比如上报当前的状态和错误信息等等。

    Write 用来向设备传输数据,要传输的数据放在目录Path下的XmlFileName中。其内容编码为GB2312,所有的tag都是用中文的,意义倒是简单明了,不过要在源代码中定义这些关键字却有些麻烦。像VS中源代码编码用的CP_ACP,而GCC要求输入的源代码编码是UTF-8,如果要在多个编译器中编译代码,最好还是用英文关键字比较好。

    Read 用来从设备读取数据,读取的数据放在目录Path下的XmlFileName中。文件格式和Write中的一样。Write/Read实现了相当于慢同步的功能,由于记录ID没有保存下来,如果一条记录被修改,MobileX会把它们当成两条不同的记录。没有什么好办法解决这个问题,好像只能删除本地的数据,然后重新从设备中读过来。

    Kill 用户主动取消时调用的,正常并不调用。

    IExch对象是MobileX在接收或者发送时创建,完成时就销毁了,考虑到用户长时间不使用时,socket可能会自动断开(虽然设置了socket的keep-alive 属性,这个问题仍然存在),所以我们也在需要连接,用完后就断开。在第一次调用SetupDevice时要,要求用户输入连接参数,然后保存到全局变量中,后面再操作时就自动连接。部分连接参数放在注册表中持久存储。

    VS对C99的支持实在太差,使用标准C函数也会报很多警告。只好选择用mingw编译mobileexplorer相关的代码,我甚至打算用C来实现这个COM接口,最后发现工作量要大很多,没有时间去折腾,只好选择VS实现COM接口。Mingw编译出来的动态库,没有VS链接需要的.lib文件,它有一个.a文件有点像.lib文件,用dumpbin可以看到里面的信息,不过拿来当.lib用时发现可以链接,但运行时会死掉,最后只好选择用LoadLibrary去调用MobileExplorer的函数。

    Read/Write是同步调用的,它会阻塞GUI线程的运行,所以要另开一个线程来做实际的收发。Read/Write的实现倒简单,只是用了MobileExplorer接口中的get_objects和update_objects,后来考虑到大数据量时的响应速度,又在MobileExplorer接口中加了get_objectsattr函数,用来得到一些诸如记录条数和ID范围之类的信息。

    在前面我们设计了一个XObject的传输对象,这里证明是明智之举。MobileX有自己的数据格式,它也是基于XML文件的,所以在MobileX和XObject之间的转换只需要写两个builder就行了。中间遇到一点小小的麻烦:MobileX中的时间和日期是两个字段,而在XObject中是合二为一的。

    整个开发过程不难,只是很多年没有在Windows下编程了,对整个环境有点陌生,甚至忘记ComboBoxEx的用法了,结果还是花了好几天时间。

    ~~end~~




  • 相关阅读:
    用两个栈实现队列
    *重建二叉树
    *链表中环的入口结点
    *复杂链表的复制
    替换空格
    python多线程文件拷贝
    进程、线程、协程
    文件处理工具sed、awk
    CentOs软件安装
    python logging模块
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167619.html
Copyright © 2020-2023  润新知