C++调用libugui.dll里的内部函数设置NX标题

本文介绍如何使用NX内部函数MT_set_ug_title定制UG窗口标题,并通过计时器实现标题栏内容的实时更新,包括显示当前模块、文档路径及设计员姓名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PS:调用内部函数难在没有函数说明,很多东西要自己去猜!要习惯NX官方的函数思路

1、找函数,我偷懒找了   王牌飞行员_里海 写的博客 :https://www.cnblogs.com/KMould/p/14107352.html,他博客还有对应函数的参数、修饰!

MT_set_ug_title为NX标题设置函数,以下是函数参数和修饰

2、使用内部函数:

       //加载dll
        auto libugui = LoadLibrary("libugui.dll");
        if (libugui)
        {
            //声明函数指针,和导出dll时头文件中函数类型一致
            typedef void(*SetNXTitle)(char* title,int a);
            SetNXTitle MyFunc;
            //通过函数名获取函数在dll中的地址
            MyFunc = (SetNXTitle)GetProcAddress(libugui, "?MT_set_ug_title@@YAXPEADI@Z");
            if (MyFunc != NULL)
            {
                MyFunc("设置新的UG标题" , 0);
            }
            //释放对dll的引用
            FreeLibrary(libugui);
        }

设置后显示如下图:

注:void MT_set_ug_title(char *,unsigned int) 中 unsigned int 这个参数我也不清楚有什么作用,但是不加这个参数就会在设置标题后面显示“(无历史记录)”

 

3、在NX的使用中,切换模块NX标题是会变的,如下图,这样切换模块后刚刚设置的新UG标题就会被NX重设了。要想在NX重设标题过后实时设置回来,需要做一个定时触发,让NX启动就加载程序达到实时更新标题栏

//用SetTimer建一个计时器,每秒触发一次

 

 

以下为一个完整的功能,实时更新NX标题显示内容为模块、显示文档路径、设计员名称(如有)
#include <uf.h>
#include <uf_ui.h>
#include <uf_part.h>
#include <uf_attr.h>

#include <atlstr.h>


void CALLBACK TimerSetTitle(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime);//回调函数

extern "C" DllExport void ufsta(char *param, int *retCode, int paramLen)  //启动UG就开始监控
{
    if (UF_initialize()) { return; }

 

 

    SetTimer(NULL, NULL, 1000, (TIMERPROC)TimerSetTitle);//每秒触发一次  

    UF_terminate();
}
extern "C" DllExport int ufusr_ask_unload()
{
    return (UF_UNLOAD_UG_TERMINATE);
}

void CALLBACK TimerSetTitle(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime)
{
    char prt0[132] = ""; //当前部件路径
    tag_t DispTag = UF_PART_ask_display_part();
    UF_PART_ask_part_name(DispTag, prt0);  //获得显示部件全路径
    char fileDir[MAX_FSPEC_BUFSIZE];
    char fileName[UF_CFI_MAX_FILE_NAME_BUFSIZE];
    const char *filePath = prt0;
    uc4576(filePath, 2, fileDir, fileName);//分割路径和部件名称

    char str[MAX_FSPEC_BUFSIZE] = "";//使用代码获取当前版本会更好
    char NX_app[256] = "";//模块变量
    char DesignName[50] = "";//设计员名字

    // 如果填写了设计人员的属性,读出并加入到显示
    if (DispTag != NULL_TAG)
    {
        int title_type;
        UF_ATTR_find_attribute(DispTag, UF_ATTR_string, "设计员", &title_type);
        if (title_type)
        {
            UF_ATTR_value_t sValue;
            char attr_value_string[257] = "";
            sValue.value.string = attr_value_string;
            char AttrTitle[UF_ATTR_MAX_TITLE_LEN + 1];
            UF_ATTR_read_value(DispTag, "设计员", UF_ATTR_string, &sValue);
            if (strlen(sValue.value.string)) sprintf(DesignName, "<%s>", sValue.value.string);
        }
    }

    int  module_id;
    UF_ask_application_module(&module_id);//获取当前模块

    if (module_id == UF_APP_MODELING)
    {sprintf(NX_app, " 建模 - [%s当前路径]〓 ", DesignName);}
    else if (module_id == UF_APP_DRAFTING)
    {sprintf(NX_app, " 制图 - [%s当前路径]〓 ", DesignName);}
    else if (module_id == UF_APP_CAM)
    {sprintf(NX_app, " 加工 - [%s当前路径]〓 ", DesignName);}
    else if (module_id == UF_APP_GATEWAY)
    {sprintf(NX_app, " 基本环境 - [%s当前路径]〓 ", DesignName);}
    else if (DispTag == NULL_TAG)
    {sprintf(NX_app, " [没有部件]");}
    else
    {sprintf(NX_app, " [%s当前路径]〓 ", DesignName);}  //其它模块有需要再弄

    sprintf(str, "%s%s", NX_app, fileDir);

       //加载dll
        auto libugui = LoadLibrary("libugui.dll");
        if (libugui)
        {
            //声明函数指针,和导出dll时头文件中函数类型一致
            typedef void(*SetNXTitle)(char* title,int a);
            SetNXTitle MyFunc;
            //通过函数名获取函数在dll中的地址
            MyFunc = (SetNXTitle)GetProcAddress(libugui, "?MT_set_ug_title@@YAXPEADI@Z");
            if (MyFunc != NULL)
            {
                MyFunc(str, 0);
            }
            //释放对dll的引用
            FreeLibrary(libugui);
        }

 }

在西门子NX软件的二次开发中,内部函数NX系统提供给开发人员的一组底层接口,用于实现对NX功能的深度调用和定制。这些函数通常以C/C++函数的形式存在于NX的动态链接库(DLL)中,例如 `libufunx.dll`、`libugui.dll`、`libuifw.dll` 和 `pskernel.dll` 等。使用这些内部函数可以增强NX的自动化能力,实现复杂的功能扩展。 ### 内部函数的使用方法 1. **识别可用的内部函数** 要查找NX内部函数,可以使用Microsoft Visual Studio提供的 `dumpbin.exe` 工具对NXDLL文件进行分析。例如,以下命令可以导出 `libugui.dll` 中的所有导出函数: ```bat "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\dumpbin.exe" -exports "D:\Program Files\Siemens\NX 12.0\NXBIN\libugui.dll" > F:\1.txt pause ``` 通过这种方式,可以获取DLL中所有可用的内部函数名称及其序号[^2]。 2. **调用内部函数** 一旦确定了某个内部函数的名称和参数,就可以通过C/C++代码进行调用。通常,需要在代码中加载对应的DLL,并通过函数指针调用目标函数。例如: ```cpp #include <windows.h> #include <iostream> typedef void (*NXFunctionType)(int, const char*); int main() { HMODULE hLib = LoadLibrary(L"libugui.dll"); if (hLib == NULL) { std::cerr << "Failed to load DLL" << std::endl; return 1; } NXFunctionType nxFunction = (NXFunctionType)GetProcAddress(hLib, "?SomeInternalFunction@SomeClass@NX@"); if (nxFunction == NULL) { std::cerr << "Failed to find function" << std::endl; FreeLibrary(hLib); return 1; } // 调用内部函数 nxFunction(1, "Test"); FreeLibrary(hLib); return 0; } ``` 上述代码展示了如何动态加载 `libugui.dll` 并调用一个名为 `SomeInternalFunction` 的函数。 3. **注意事项** - 内部函数的接口和实现可能会在不同版本的NX中发生变化,因此在使用时需要确保代码与当前NX版本兼容。 - 调用内部函数时应格外小心,避免因参数错误或内存管理不当导致程序崩溃。 - 建议在开发过程中结合NX的官方文档和调试工具,确保函数调用的正确性。 ### 示例:调用NX内部函数执行几何体创建 以下是一个简化的示例,展示如何通过内部函数创建一个简单的几何体(如立方体): ```cpp #include <uf.h> #include <uf_modl.h> extern "C" DllExport void ufusr(char* param, int* returnCode, int paramLen) { // 初始化NX会话 UF_initialize(); // 创建立方体 tag_t block_tag; UF_MODL_create_block(10.0, 10.0, 10.0, &block_tag); // 终止NX会话 UF_terminate(); } ``` 在该示例中,`UF_MODL_create_block` 是NX的一个内部函数,用于创建立方体几何体。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值