开发环境:VS2015 Professional + NX12.0.2.9
场景描述:
在NX解决方案下,我添加了两个公共库,一个是Common,一个是Cam,输出类型均为dll
然后我在使用开发包功能A时,ufusr入口添加了模块检查:
UF_initialize();
if (!LCCAM::IsInCAM())
{
LCC::MessageBox(true, "请进入CAM环境!");
UF_terminate();
return;
}
IsInCAM()代码在Cam库中,代码如下:
bool LCCAM::IsInCAM()
{
int module = UF_APP_NONE;
UF_ask_application_module(&module);
return (module == UF_APP_CAM);
}
这时会提示报错信息,请进入CAM环境。
然后我手动进入CAM模块,就会报错:
(1)VS编译器环境调试方式:
(2)使用NX编译后的安装包方式:
注意:重新生成解决方案后,Debug/Release均报错。
DLL卸载方式为:Session::LibraryUnloadOptionImmediately
报错prt条件:
(1)prt为新建prt,保存,关闭重新打开。如果prt新建没有关闭则不会报错
(2)测试prt并不在CAM模块下,且没有手动切入到CAM模块
原因分析:
有一个很奇怪的现象,解决方案中有很多项目,
如果项目ufusr入口处添加了LCCAM::IsInCAM(),进入CAM模块一定会失败!
如果项目ufusr入口处没有添加LCCAM::IsInCAM(),进入CAM模块也可能会失败,绝大多数失败!
我开始以为是Cam库有问题,然而发现有一个项目只使用了Common库,进入CAM模块也会失败..................
这就很奇怪了!为什么只使用了Common库也会有问题呢,我决定从Common库这一点入手。
因为这个Common库是从另外一个解决方案LS那里摘过来并加以补充的,我决定用LS测试一下,
测试发现LS居然可以进入CAM模块!
那就肯定是Common库新增代码的问题了,最终发现:
如果不添加CAM模块的uf函数,那么就是成功的,CAM模块的NXOpen函数不会报错。
但是没道理啊,别的解决方案也用了cam的uf函数,为什么没有报错呢?
为此我去查找其他的解决方案,很可惜没有找到NX12的,但却找到一个NX10的解决方案,发现公共库里是有uf的,
我测试了一下,他们的功能可以切入到CAM模块,这是为什么呢?
然后我发现,他们输出的是lib,然后我就把Common库改为lib(记得把代码中DLL_EXPORT等关键字删除),测试通过。
难道输出lib就可以了吗?此时的我开心的以为找到了答案。
于是我把Cam库也改成了lib,事实证明我还是太年轻了,Cam库还是报错。
试了很多方法,都没有找到Cam库失败的原因。退一步讲,即使Cam库成功了,那为什么输出dll就不行呢?
这个问题留在这里,找到原因后会更贴。知道答案的朋友也请讲解一下,多谢!
如何解决:
虽然不知道原因是什么,就暂认为NX对于CAM模块支持不好吧,其他模块是没有这个问题的,目前有两个方法可以避免:
(1)通过标签的显示,即仅在CAM模块下显示该标签
(2)卸载时使用Session::LibraryUnloadOptionAtTermination
extern "C" DllExport int ufusr_ask_unload()
{
//return (int)Session::LibraryUnloadOptionExplicitly;
return (int)Session::LibraryUnloadOptionImmediately;
//return (int)Session::LibraryUnloadOptionAtTermination; //使用Termination不会报错
}