zoukankan      html  css  js  c++  java
  • 与wmi交互,调非托管代码,单元测试遇到的一些问题

    做监视刷卡动作的程序

    刷卡后会产生消息,外部能通过wmi的方式获取实时的刷卡动作的数据

    程序监听

    new ManagementEventWatcher 建对象

    watcher.EventArrived 注册事件处理方法

    e.NewEvent.GetPropertyValue("Time"); 通过这种方式来获取想要的数据,这个名字一般是卡那边厂商提供你才知道的

    接下来就是去调海康摄像头抓图,sdk提供的dll全是C++封装的。这个真不友好

    出于安全考虑,获取wmi消息不能远程,所以本机不能测试

    对这些三方sdk不熟,不能测试,代码盲写,这是巨坑,只好用单元测试模拟

    单元测试不能正常运行,遇到些问题

    修改测试配置,选相应的选项, 如x64

     

    wmi的EventArrivedEventArgs不能手动创建,EventArgs强转也报错,但是李氏替换,父转子想想也不可能

    那就没法测试了吗?

    大不了我不直接调这个事件处理方法,另写一个方法完全复制这个事件处理方法,把事件参数都干掉,加上需要的参数,需要什么我传什么!

    果然成了,

    继续f10,又出问题了,找不到配置信息

    原来测试程序使用自己的config文件,那就把config文件复制到测试项目下

    ,ok了

     后面要求远程方式链接wmi,但是只有内部的某台机器能联。开发这边还是不能联。

    //watcher.EventArrived += new EventArrivedEventHandler(HandleEvent);
                    //watcher.Start(); //远程连wmi行不通,报错。

    尝试了很多办法报错:RPC不可用,去使用了微软官方的链接工具wmi code creator连接也会报错,排除了代码层面的问题。

    微软帖子有牛人给了解决办法太麻烦(连接的两边都要做一些windows底层的各种安全配置),不太可行。。。

    发现微软文档示例中使用的是:WaitForNextEvent(),咱也试试看
    while (true)
                    {
                        var e = watcher.WaitForNextEvent();
                        var Time = e["Time"] == null ? "" : e["Time"].ToString();
                        //HandleWaitForNextEventFunc(e);
                        HandleWaitForNextEventFunc(Time);
                    }

    总的来说还是可以

  • 相关阅读:
    BZOJ 1040 (ZJOI 2008) 骑士
    BZOJ 1037 (ZJOI 2008) 生日聚会
    ZJOI 2006 物流运输 bzoj1003
    ZJOI 2006 物流运输 bzoj1003
    NOI2001 炮兵阵地 洛谷2704
    NOI2001 炮兵阵地 洛谷2704
    JLOI 2013 卡牌游戏 bzoj3191
    JLOI 2013 卡牌游戏 bzoj3191
    Noip 2012 day2t1 同余方程
    bzoj 1191 [HNOI2006]超级英雄Hero——二分图匹配
  • 原文地址:https://www.cnblogs.com/mmclog/p/14250549.html
Copyright © 2011-2022 走看看