/*****************************************************************************
ufd_load_library.c
本文件将演示如何使用以下的 UG/Open API 函数(s):
UF_load_library
UF_unload_library
描述:
UF_load_library 加载library_name指定的共享库,并发现由symbol_name指定的入口点。
不难看出它有些类似于GetProcAddress,但使用更简单,当然也仅仅适应于UF/Open API范畴。
环境:
VS2008编译,在NX 4.0/NX 6.0上测试通过。
历史:
日期 作者 备注
2010-11-02 zale_lzj 创建
*****************************************************************************/
#include <stdio.h>
#include <uf.h>
#include <uf_defs.h>
#include <uf_exit.h>
#include <uf_part.h>
#include <uf_ui.h>
#pragma comment(lib, "libufun.lib")
#pragma comment(lib, "libugopenint.lib")
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
static int report_error( char *file, int line, char *call, int irc)
{
if (irc)
{
char err[133], messg[300];
logical response;
UF_UI_is_listing_window_open(&response);
if (!response)
UF_UI_open_listing_window();
UF_get_fail_message(irc, err);
sprintf_s(messg, 300, "\n%s\nerror %d at line %d in %s\n%s",
err, irc, line, file, call);
UF_UI_write_listing_window(messg);
UF_UI_write_listing_window("\n");
}
return(irc);
}
static void do_it(void)
{
typedef void (*load_ufusr_f_p_t)(char* param, int* retcode, int paramLen);
load_ufusr_f_p_t load_ufusr_ptr = NULL;
char* file_path = "C:\\Program Files\\UGS\\NX 4.0\\TOOLING_BASE\\application\\ugmold_view.dll";
int irc = UF_CALL(UF_load_library(file_path, "ufusr", (UF_load_f_p_t*)&load_ufusr_ptr));
if (load_ufusr_ptr != NULL)
{
int retcode;
load_ufusr_ptr("", &retcode, 0);
}
if (irc != 0)
{
uc1601("failed load", 1);
UF_CALL(UF_unload_library(file_path)); // 注意该语句只能在失败时被调用,否则UG会退出
return;
}
}
void ufusr(char *param, int *retcode, int paramLen)
{
if (UF_CALL(UF_initialize())) return;
if (UF_PART_ask_display_part() != NULL_TAG)
do_it();
else
uc1601("No active part", 1);
UF_terminate();
}
int ufusr_ask_unload(void)
{
return (UF_UNLOAD_IMMEDIATELY);
}
void ufusr_cleanup (void)
{
return;
}
评论0