NX二次开发 进入CAM模块失败

开发环境: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不会报错
}

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值