PCB InCAM 获取 JOB STEP 实现外挂脚本调试功能实现
PCB CAM自动化基于Incam 打造,在测试时经常遇到调试障碍,每次自行对功能测试时,生成了exe脚本后,再到Incam里面运行,发现问题,再回来修改代码,非常不爽, 参考Genesis调试运行模式的方式,为了工程组写脚本调试时用着爽,那就让大家爽一下,,扩展了一下InCAM 调试功能(即可以在Visual Studio 中可以加断点边调边执行COM指令), 先采用类似Genesis一样查找JOB内存地址,结果碰壁了, 得寻找另外一种方式,发现InCAM每个窗品标题栏都含有JOB与STEP信息,以这个为出发点就很好解决了.
一.获取JOB名的方法(同时兼容,内挂,外挂,区分Genesis,InCAM)
写好一个脚本,可以外挂运行,也可以内挂运行
/// <summary>
/// 获取JOB名
/// </summary>
/// <param name="JOB_Address"> 如是外挂使用时:填写JOB基址</param>
/// <returns></returns>
public static string getJOB(int JOB_Address = _JOB_Address, int pid = ) // 97b2 0x2FE623C 99b 0x0307BF84
{
if (pid > ) //pid 大于0为外挂启用
{
if (JOB_Address == ) { JOB_Address = _JOB_Address; }
g.JOB = API.ReadMemorystring(JOB_Address, pid);
}
else
{
if (gPID > )
{
if (g.isInCam())
{
string incamTitel = getWindowAllTiltel(); //获取incam标题 调用下方的函数了 不能像Genesis一样通过基址找到JOB地址呢
if (!string.IsNullOrEmpty(incamTitel))
{
incamTitel = incamTitel.Replace(" ", " ");
var arrList = incamTitel.Split(' ');
g.JOB = arrList[];
g.STEP = arrList[];
}
}
else
{
g.JOB = API.ReadMemorystring(JOB_Address, gPID);
}
}
else
{
if (JOB_Address == ) { JOB_Address = _JOB_Address; }
g.JOB = System.Environment.GetEnvironmentVariable("JOB");
}
}
return (g.JOB);
}
/// <summary>
/// 模糊查找标题 incam标题获得JOB STEP名
/// </summary>
/// <param name="TitlelName">InCAM v4</param>
/// <returns></returns>
public static string getWindowAllTiltel(string TitlelName = "InCAM v4")
{
string result = "";
StringBuilder sb = new StringBuilder();
IntPtr desktopPtr = API.GetDesktopWindow();
IntPtr winPtr = API.GetWindow(desktopPtr, GetWindowCmd.GW_CHILD);
while (winPtr != IntPtr.Zero)
{
winPtr = API.GetWindow(winPtr, GetWindowCmd.GW_HWNDNEXT);
API.GetWindowTextW(winPtr, sb, sb.Capacity);
if (sb.ToString().IndexOf(TitlelName) > -)
{
result = sb.ToString();
winPtr = IntPtr.Zero;
}
}
return result;
}
二.用于查找InCAM标题WindowsAPI
/// <summary>
/// 获取窗口Text
/// </summary>
/// <param name="hWnd"></param>
/// <param name="lpString"></param>
/// <param name="nMaxCount"></param>
/// <returns></returns>
[DllImport("user32.dll")]
public static extern int GetWindowTextW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount); /// <summary>
/// 该函数返回桌面窗口的句柄。桌面窗口覆盖整个屏幕。桌面窗口是一个要在其上绘制所有的图标和其他窗口的区域。
/// 【说明】获得代表整个屏幕的一个窗口(桌面窗口)句柄.
/// </summary>
/// <returns>返回值:函数返回桌面窗口的句柄。</returns>
[DllImport("user32.dll", EntryPoint = "GetDesktopWindow", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr GetDesktopWindow();
/// <summary>
/// 该函数返回与指定窗口有特定关系(如Z序或所有者)的窗口句柄。
/// 函数原型:HWND GetWindow(HWND hWnd,UNIT nCmd);
/// </summary>
/// <param name="hWnd">窗口句柄。要获得的窗口句柄是依据nCmd参数值相对于这个窗口的句柄。</param>
/// <param name="uCmd">说明指定窗口与要获得句柄的窗口之间的关系。该参数值参考GetWindowCmd枚举。</param>
/// <returns>返回值:如果函数成功,返回值为窗口句柄;如果与指定窗口有特定关系的窗口不存在,则返回值为NULL。
/// 若想获得更多错误信息,请调用GetLastError函数。
/// 备注:在循环体中调用函数EnumChildWindow比调用GetWindow函数可靠。调用GetWindow函数实现该任务的应用程序可能会陷入死循环或退回一个已被销毁的窗口句柄。
/// 速查:Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:1.0以上版本;头文件:winuser.h;库文件:user32.lib。
/// </returns>
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr GetWindow(IntPtr hWnd, GetWindowCmd uCmd);
/// <summary>
/// 窗口与要获得句柄的窗口之间的关系。
/// </summary>
public enum GetWindowCmd : uint
{
/// <summary>
/// 返回的句柄标识了在Z序最高端的相同类型的窗口。
/// 如果指定窗口是最高端窗口,则该句柄标识了在Z序最高端的最高端窗口;
/// 如果指定窗口是顶层窗口,则该句柄标识了在z序最高端的顶层窗口:
/// 如果指定窗口是子窗口,则句柄标识了在Z序最高端的同属窗口。
/// </summary>
GW_HWNDFIRST = ,
/// <summary>
/// 返回的句柄标识了在z序最低端的相同类型的窗口。
/// 如果指定窗口是最高端窗口,则该柄标识了在z序最低端的最高端窗口:
/// 如果指定窗口是顶层窗口,则该句柄标识了在z序最低端的顶层窗口;
/// 如果指定窗口是子窗口,则句柄标识了在Z序最低端的同属窗口。
/// </summary>
GW_HWNDLAST = ,
/// <summary>
/// 返回的句柄标识了在Z序中指定窗口下的相同类型的窗口。
/// 如果指定窗口是最高端窗口,则该句柄标识了在指定窗口下的最高端窗口:
/// 如果指定窗口是顶层窗口,则该句柄标识了在指定窗口下的顶层窗口;
/// 如果指定窗口是子窗口,则句柄标识了在指定窗口下的同属窗口。
/// </summary>
GW_HWNDNEXT = ,
/// <summary>
/// 返回的句柄标识了在Z序中指定窗口上的相同类型的窗口。
/// 如果指定窗口是最高端窗口,则该句柄标识了在指定窗口上的最高端窗口;
/// 如果指定窗口是顶层窗口,则该句柄标识了在指定窗口上的顶层窗口;
/// 如果指定窗口是子窗口,则句柄标识了在指定窗口上的同属窗口。
/// </summary>
GW_HWNDPREV = ,
/// <summary>
/// 返回的句柄标识了指定窗口的所有者窗口(如果存在)。
/// GW_OWNER与GW_CHILD不是相对的参数,没有父窗口的含义,如果想得到父窗口请使用GetParent()。
/// 例如:例如有时对话框的控件的GW_OWNER,是不存在的。
/// </summary>
GW_OWNER = ,
/// <summary>
/// 如果指定窗口是父窗口,则获得的是在Tab序顶端的子窗口的句柄,否则为NULL。
/// 函数仅检查指定父窗口的子窗口,不检查继承窗口。
/// </summary>
GW_CHILD = ,
/// <summary>
/// (WindowsNT 5.0)返回的句柄标识了属于指定窗口的处于使能状态弹出式窗口(检索使用第一个由GW_HWNDNEXT 查找到的满足前述条件的窗口);
/// 如果无使能窗口,则获得的句柄与指定窗口相同。
/// </summary>
GW_ENABLEDPOPUP =
}
三.InCAM实现外挂调试效果
可边调试,边操作InCAM
PCB InCAM 获取 JOB STEP 实现外挂脚本调试功能实现的更多相关文章
- 怎么用C#获取Scenario step在specflow里
公司最近在用specflow 这种BDD的模式,但PM还是想把case再存进TestManager里面一份儿一遍后期集成TestManager 自动runcase用.所以我们需要获取每个scenari ...
- 获取redis主从复制链SHELL脚本
获取redis主从复制链SHELL脚本 vi redisnode.sh #!/bin/sh master_host=$ master_port=$ auth=$ #判断输入密码是否为空,为空则转化为' ...
- 通过kfed自动获取磁盘信息的小脚本
通过kfed自动获取磁盘信息的小脚本 编译KFED [oracle@rac lib]$cd $ORACLE_HOME/rdbms/lib [oracle@rac lib]$ pwd /u01/app/ ...
- Python获取程序运行目录和脚本目录
Python获取程序运行目录和脚本目录 import os import sys #获取脚本所在目录 print os.path.split( os.path.realpath( sys.argv[0 ...
- shell脚本调试
转自:http://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ 一. 前言 shell编程在unix/linux世界中使用得非常广泛,熟 ...
- 【转】Linux Shell脚本调试技术
本文转载自:https://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ Shell脚本调试技术 本文全面系统地介绍了shell脚本调试技 ...
- shell脚本调试技术_转
转自:http://itlab.idcquan.com/linux/SHELL/727128.html 参考:https://linux.cn/article-8045-1.html 本文全面系统地介 ...
- Shell脚本调试技术
http://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ 一. 前言 shell编程在unix/linux世界中使用得非常广泛,熟练掌握 ...
- shell中脚本调试----学习
1.使用dos2unix命令处理在windows下开发的脚本 将windows下编辑的脚本放置到linux下执行的情况如下: [root@ks ~]# cat -v nginx.sh #!/bin/b ...
随机推荐
- ORACLE 查看当前用户信息(用户,表视图,索引,表空间,同义词,存储过程,约束条件)
1.用户 查看当前用户的缺省表空间 SQL>select username,default_tablespace from user_users; 查看当前用户的角色 SQL>select ...
- Vim常用快捷键--正常的学习曲线
vim可能对于初学者不太友好,学习曲线有点陡,特此整理了较为平滑的学习曲线的学习快捷键的方式,包含最常用的快捷键,让初学者领悟vim的优点,想要进阶学习请查找其它更好的教程 正常模式:可以使用快捷键命 ...
- python3 的range
1. range(3):从0到2: 2. range(3,10,2):从3到10,隔一个数显示一个: 3.list(range(3,10,-2):结果为空: 4. S[::2] : 同隔一个数显示一个 ...
- Django DTL模板语法中的url反转
"""template_url_demo URL Configuration The `urlpatterns` list routes URLs to views. F ...
- Java基础学习总结(81)——如何尽可能的减少Java代码中bug
Java编程语言的人气自然无需质疑,从Web应用到Android应用,这款语言已经被广泛用于开发各类应用及代码中的复杂功能. 不过在编写代码时,bug永远是困扰每一位从业者的头号难题.在今天的文章中, ...
- jsp之${CTX}理解
jsp之${CTX} 根据自己的需要选择以下标签. <%@ taglib uri="/struts-tags" prefix="s"%> <% ...
- 网线切割&切绳子
题目描述 Wonderland居民决定举行一届地区性程序设计大赛.仲裁委员会志愿负责这次赛事并且保证会组织一次有史以来最公正的比赛.为此,所有参赛者的电脑和网络中心会以星状网络连接,也就是说,对每个参 ...
- Ubuntu 16.04常用快捷键(转)
注意:在Linux下Win键就是Super键 启动器 Win(长按) 打开启动器,显示快捷键 Win + Tab 通过启动器切换应用程序 Win + 1到9 与点击启动器上的图标效果一样 Win + ...
- angularjs中比较实用的multipleselect选择框
一. HTML HTML中比较多逻辑代码,修改的时候要注意修改很多绑值的地方. <div class="form-group"> <label class=&qu ...
- 重学数据结构系列之——平衡树之SB Tree(Size Blanced Tree)
学习来源:计蒜客 平衡树 1.定义 对于每一个结点.左右两个子树的高度差的绝对值不超过1,或者叫深度差不超过1 为什么会出现这样一种树呢? 假如我们依照1-n的顺序插入到二叉排序树中,那么二叉排序树就 ...