NX二次开发 版本通用方法
对于用C++做NX二次开发,随着NX的版本变更,二开所用的函数也会有相应的更新调整,生成的DLL不能跨版本运行,报错率极高,甚至不能加载。折腾了好久找到三种方法:
1.纯使用C++的代码开发或者尽可能使用UF函数(方法不大靠普,能不能跨版使有点碰运气的成份)
2.同一功能对应不同的NX版本编译不同版本的DLL,对应不同的版本建立不同的按钮。(亲测是能正常使用,但是一个功能多个按钮,不专业)
3.同一个功能多个版本共用一个按钮,建立一个主DLL通过识别NX主版本,再根据NX的版本调用该功能对应版本的DLL(看起来专业多了,目前NX8.5、NX10、NX12 NX1946 做了测试,正常使用。不知道二开高手是怎么做,有更好的方法请指点下)
法1 和法 2 都有明显的缺陷,不适用,下面说明下法3是如何实现的。(自个网上找资料折腾出来的方法,不知道对不对,目前功能实现起来是没有问题)
1)首先把功能对应NX版本编译不同的DLL

2)新建工程

3)工程创建以下函数
//获取运行程序的路径
HMODULE GetSelfModuleHandle()
{
MEMORY_BASIC_INFORMATION mbi;
return ((::VirtualQuery(GetSelfModuleHandle, &mbi, sizeof(mbi)) != 0)
? (HMODULE)mbi.AllocationBase : NULL);
}
CString GetProgramDir() //获取运行程序的路径
{
char exeFullPath[MAX_PATH]; // 全路径
string strPath = "";
GetModuleFileName(GetSelfModuleHandle(), exeFullPath, MAX_PATH);
strPath = (string)exeFullPath; // 获取程序路径
int pos = strPath.find_last_of('\\', strPath.length());
CString path;
path = strPath.substr(0, pos).c_str();
return path;
}
string MyClass::GetPath() //输出程序路径
{
CString exe_path = GetProgramDir();
string ProgramDirPath = exe_path;
return string(ProgramDirPath);//返回路径
}
string MyClass::YiNingToolPath(string DLLDir) //分割程序路径获取工具目录
{
try
{
//反向找位置,分割字符串(只读取文件夹路径)
string strPath = DLLDir;
string strDir;
int nPos = strPath.find_last_of('\\');
if (string::npos != nPos)
{
strDir = strPath.substr(0, nPos);
}
return string(strDir);//返回文件夹路径
}
catch (exception& ex)
{
//---- Enter your exception handling code here -----
MyClass::theUI->NXMessageBox()->Show("分割程序路径获取工具目录", NXOpen::NXMessageBox::DialogTypeError, ex.what());
}
}
void MyClass::UFUN_API_Call_DLL(char* dllPath)
{
//调系统命令
typedef void(*load_ufusr_f_p_t)(char* param, int* retcode, int paramLen);
load_ufusr_f_p_t load_ufusr_ptr = NULL;
int irc = UF_load_library(dllPath, "ufusr", (UF_load_f_p_t*)&load_ufusr_ptr);
//调用DLL
if (load_ufusr_ptr != NULL)
{
int retcode;
load_ufusr_ptr(dllPath, &retcode, 1);
}
if (irc != 0)
{
uc1601("failed load", 1);
UF_unload_library(dllPath); // 注意该语句只能在失败时被调用,否则UG会退出
return;
}
}
void MyClass::GetNXRev()//获取NX主要版本
{
try
{
UF_initialize();
theSession->ListingWindow()->Open();//打开信息窗口
//获取NX主要版本
UF_get_release(&NXrelease); //获取NX主要版本
//theSession->ListingWindow()->WriteLine(NXrelease);
UF_terminate();
}
catch (exception& ex)
{
//---- Enter your exception handling code here -----
MyClass::theUI->NXMessageBox()->Show("帮助", NXOpen::NXMessageBox::DialogTypeError, "程序错误,请检查代码");
}
}
void MyClass::CallToolingDLL(string CallDllName) //对应版本调用DLL
{
try
{
UF_initialize();
theSession->ListingWindow()->Open();//打开信息窗口
string CurrentDllPath = GetPath();//输出程序路径
string CurrentToolPath = YiNingToolPath(CurrentDllPath); //分割程序路径获取工具目录
//theSession->ListingWindow()->WriteLine("当前DLL路径:" + CurrentDllPath);
//theSession->ListingWindow()->WriteLine("当前外挂路径:" + CurrentToolPath);
string NX85DllPath = CurrentDllPath + "\\NX85\\" + CallDllName + "_NX85.dll";
string NX10DllPath = CurrentDllPath + "\\NX10\\" + CallDllName + "_NX10.dll";
string NX12DllPath = CurrentDllPath + "\\NX12\\" + CallDllName + "_NX12.dll";
string NX1946DllPath = CurrentDllPath + "\\NX1946\\" + CallDllName + "_NX1946.dll";
char YiNing_tools_NX85[256];
char YiNing_tools_NX10[256];
char YiNing_tools_NX12[256];
char YiNing_tools_NX1946[256];
sprintf(YiNing_tools_NX85, "%s", NX85DllPath.c_str());
sprintf(YiNing_tools_NX10, "%s", NX10DllPath.c_str());
sprintf(YiNing_tools_NX12, "%s", NX12DllPath.c_str());
sprintf(YiNing_tools_NX1946, "%s", NX1946DllPath.c_str());
GetNXRev();//获取NX主版本
//获取NX主要版本
if (strcmp(NXrelease, "NX V8.5") == 0)
{
UFUN_API_Call_DLL(YiNing_tools_NX85);
//theSession->ListingWindow()->WriteLine(YiNing_tools_NX85);
}
else if (strcmp(NXrelease, "NX V10.0") == 0)
{
UFUN_API_Call_DLL(YiNing_tools_NX10);
//theSession->ListingWindow()->WriteLine(YiNing_tools_NX10);
}
else if (strcmp(NXrelease, "NX V12.0") == 0)
{
UFUN_API_Call_DLL(YiNing_tools_NX12);
//theSession->ListingWindow()->WriteLine(YiNing_tools_NX12);
}
else if (strcmp(NXrelease, "NX V1926") == 0)
{
UFUN_API_Call_DLL(YiNing_tools_NX1946);
//theSession->ListingWindow()->WriteLine(YiNing_tools_NX1946);
}
UF_terminate();
}
catch (exception& ex)
{
//---- Enter your exception handling code here -----
MyClass::theUI->NXMessageBox()->Show("对应版本调用", NXOpen::NXMessageBox::DialogTypeError, "程序错误,请检查代码");
}
}
3)入口函数徙通过字符串对比识别菜单按钮调用DLL

4)编译生成DLL:YiNingToolsSelectMen.dll
5)外挂菜单挂上生成的DLL

6)效果图如下

NX二次开发 版本通用方法的更多相关文章
- 【NX二次开发】NX内部函数,查找内部函数的方法
[NX二次开发]NX内部函数,libufunx.dll文件中的内部函数 [NX二次开发]NX内部函数,libugui.dll文件中的内部函数 [NX二次开发]NX内部函数,libuifw.dll文件中 ...
- NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))
NX二次开发API里没有对EXCAL读写操作的相关函数,市面上有很多种方法去实现,比如UFUN调KF,ODBC,OLE(COM组件)等等.这里我是用的OLE(COM组件)方式去做的,这种在VC上创建的 ...
- NX二次开发-UDO用户自定义对象(UFUN)【持续完善】
每当提起UDO总是会让我想起大专毕业那会失业找工作,后来有个宝贵机会去了软件公司上班,拿到了我人生中的第一个NX二次开发项目,一个关于测量汽车前后左右摄像头的项目.当时那个项目就用到了UDO,对于只看 ...
- C# NX二次开发环境搭建
在网上看到一篇C#二次开发环境搭建的文章:NX二次开发-使用NXOPEN C#手工搭建开发环境配置 ,写得非常好.我按照文章操作,过程中遇到几个问题,把问题分享给大家,希望对各位有帮助. 注意三点: ...
- NX二次开发-C#使用DllImport调用libufun.dll里的UF函数(反编译.net.dll)调用loop等UF函数
在写这篇文章的时候,我正在头晕,因为下班坐车回家,有些晕车了.头疼的要死.也吃不下去饭. 版本:NX11+VS2013 最近这一年已经由C++过度到C#,改用C#做应用程序开发和NX二次开发. C#在 ...
- NX二次开发-创建NX9 NXOpenCPP Wizard开发向导模板
这篇文章,我在CSDN,在唐工论坛都发过.http://www.nxopen.cn/forum.php?mod=viewthread&tid=2039&highlight=NX9 博客 ...
- NX二次开发-基于NX开发向导模板的NX对Excel读写操作(OLE方式(COM组件))
在看这个博客前,请读者先去完整看完:NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))https://ufun-nxopen.blog.csdn.net/article ...
- NX二次开发-BlockUI对话框嵌套MFC对话框制作进度条
半年前在一些QQ群看到有大神NX二次开发做出了进度条,那个时候我还不会弄,也不知道怎么弄得,后来断断续续得研究了一下,直到今天我把它做出来了.内心还是很喜悦的!回想自己这两年当初从没公司肯给我做NX二 ...
- NX二次开发-UFUN计算两点距离UF_VEC3_distance
NX11+VS2013 #include <uf.h> #include <uf_curve.h> #include <uf_vec.h> UF_initializ ...
- NX二次开发-NX+VS写代码设断点调试技巧
在做NX二次开发的时候写完代码,编译可以通过,但是执行的时候却没有反应,或者得到的结果不对,说明肯定有地方传值出错了.我在查找代码错误的时候有几种方法:1.uc1601打印函数输入和输出的值看对不对. ...
随机推荐
- CF1793E Velepin and Marketing
个人思路: 从小到大排序,因为一定先满足小的,再满足大的. 分组时,我们发现,同一组内的数在排序后的序列内连续,这样更优.因为(不会证). 我们预处理出对于每个出书数量的答案,查询时直接输出即可.我们 ...
- 敌兵布阵 HDU - 1166 - 单点修改,区间查询:树状数组/线段树
C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...
- 暑假学习四 8.26 Hadoop的简单使用
先说今日情况,本来打算返校结果回不去,然后身体差发烧了,就随便学了一些东西,阑尾炎还是好疼. 有一说一,我觉得我的电脑真的有点拉啊,三台虚拟机开启之后,运存直接90%,呜呜响,和我本人情况一样,麻了 ...
- 通过网页下载qq音乐在线听歌曲
1.输入网址 打开 qq音乐网页版 https://y.qq.com/ 2.搜索喜欢的歌曲 3.播放喜欢的歌曲 4.谷歌浏览器检查代码 5.找到 network栏 搜索 m4a 6.找到相关地址 复制 ...
- Kubernetes--Ingress资源类型
Ingress资源类型 基于HTTP暴露的每个Service资源均可发布于一个独立的FQDN主机名之上,如 " www.ik8s.io " :也可发布于某主机上的URL路径之上,从 ...
- Windows server 2016 域服务1之创建域
谁知道以后会不会用到呢,总不能现学不是,写下来以后也许用的上. 本文为自己实验操作,工作环境是否与之相同本人并不清楚,步骤中详略参半,原理不会在这里说,因为我也不清楚. 1.首先安装域服务,选择添加角 ...
- 网络IO模型_01
4种情况: 1.输入操作:等待数据到达套接字接收缓冲区: 2.输出操作:等待套接字发送缓冲区有足够的空间容纳将要发送的数据: 3.服务器接收连接请求:等待新的客户端连接请求的到来: 4.客户端发送连接 ...
- OOP前三次作业总结
一.前言 在开始OOP学习之前,我从未了解过什么是面向对象编程,想当然的认为OOP是像从前学习C一样的编程逻辑(即面向过程编程),但在真正开始学习OOP之后,我了解到了以往面向过程编程的局限性与不便利 ...
- phpExcel常用方法详解
phpExcel常用方法详解[附有php导出excel加超级链接] 发表于4年前(2012-07-20 12:57) 阅读(510) | 评论(0) 0人收藏此文章, 我要收藏 赞0 http://w ...
- linux清除日志和文件缓存
1.查找大文件,从根目录 find / -type f -size +800M 2.查看磁盘挂载情况及挂载目录 df -lh 3.查看内存使用情况 free -m 4.清除缓存 echo 3 > ...