一些 NX 使用者,经常提出一个需求,在NX的顶部标题栏显示当前显示部件的全路径,网上也有一些类似外挂或实现方法,比如利用定时器不断刷新,但这个方法存在一个弊端就是有时候会有明显卡顿。
通过测试,发现其他两种方式:1、使用多线程来代替定时器。2、 注册 切换模块回调、注册文件打开回调,在回调函数中设置。此处介绍一下多线程的方式。
1、首先更改卸载方式,如下
extern "C" DllExport int ufusr_ask_unload(){ return (int)Session::LibraryUnloadOptionAtTermination; }2、使用入口函数ufsta,并在入口函数中启动线程
HANDLE findThread = (HANDLE)_beginthreadex(NULL, 0, EditTitleThread, NULL, 0, NULL);CloseHandle(findThread);3、定义和声明线程执行函数“EditTitleThread”,此处设置为1s刷新一次
UINT EditTitleThread(LPVOID pParam){ AFX_MANAGE_STATE(AfxGetStaticModuleState()); int sleepTime = 1000; while (g_isContinue) { tag_t t_workPart = CONTEXT_ask_work_part(); if (t_workPart) { char* partName = PART_ask_filename_of_part(t_workPart); g_ugCwnd->SetWindowText(UTF8ToGBK(partName).c_str()); SM_free(partName); } else { g_ugCwnd->SetWindowText("NX"); } Sleep(sleepTime); } return 0;}通过以上几部完成程序主体功能,其中一些开发人员表示,在线程中执行NX函数会报错,通过测试,确实存在这个问题,但对于一些检查获取函数,测试过程并没有报错。比如获取组件路径的UF函数。
此处我使用的是dll导出函数,测试也是正常运行。上述用到的导出函数如下:
//加载HINSTANCE g_NxInterF_libpart_dll = LoadLibrary("libpart.dll");HINSTANCE g_NxInterF_libsyss_dll = LoadLibrary("libsyss.dll"); //导出typedef char* (*PART_ask_filename_of_part_P)(tag_t);PART_ask_filename_of_part_P PART_ask_filename_of_part = NULL;PART_ask_filename_of_part = (PART_ask_filename_of_part_P)::GetProcAddress(g_NxInterF_libpart_dll, "?PART_ask_filename_of_part@@YAPEADI@Z"); //导出typedef tag_t (*CONTEXT_ask_work_part_P)(void);CONTEXT_ask_work_part_P CONTEXT_ask_work_part = NULL;CONTEXT_ask_work_part = (CONTEXT_ask_work_part_P)::GetProcAddress(g_NxInterF_libpart_dll, "?CONTEXT_ask_work_part@@YAIXZ"); //导出typedef void (*SM_free_P)(void* );SM_free_P SM_free = NULL;SM_free = (SM_free_P)::GetProcAddress(g_NxInterF_libsyss_dll, "?SM_free@@YAXPEAX@Z"); //卸载FreeLibrary(g_NxInterF_libpart_dll);g_NxInterF_libpart_dll = NULL;FreeLibrary(g_NxInterF_libsyss_dll);g_NxInterF_libsyss_dll = NULL;注意其中获取文件路径函数,返回的char*值为UTF8编码,如果是多字符集,注意需要 转换 一下:
string UTF8ToGBK(const char* strUTF8){ int len = MultiByteToWideChar(CP_UTF8, 0, strUTF8, -1, NULL, 0); wchar_t* wszGBK = new wchar_t[len + 1]; memset(wszGBK, 0, len * 2 + 2); MultiByteToWideChar(CP_UTF8, 0, strUTF8, -1, wszGBK, len); len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL); char* szGBK = new char[len + 1]; memset(szGBK, 0, len + 1); WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, szGBK, len, NULL, NULL); string strTemp(szGBK); if (wszGBK) delete[] wszGBK; if (szGBK) delete[] szGBK; return strTemp;}获取NX窗口句柄:
HWND hParentWndXX = (HWND)UF_UI_get_default_parent();
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删