一些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();