zoukankan      html  css  js  c++  java
  • 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)效果图如下

    怡宁塑胶模具设计
  • 相关阅读:
    项目下目录正确,却出现404
    Operation not allowed after ResultSet closed 结果集关闭异常
    Could not autowire.No beans of 'ItemsService' type found
    python,hashlib模块
    Ajax PHP项目实战
    PHP的数据类型总结
    解析导航栏的url
    PHP--冒泡、选择、插入排序法
    jQuery(二) jQuery对Ajax的使用
    easyui(一) 初始easyui
  • 原文地址:https://www.cnblogs.com/hqsalanhuang/p/15013419.html
Copyright © 2011-2022 走看看