iCAx开思网

标题: 求助谁会UG二次开发的外部程序编写 [打印本页]

作者: stone_dong    时间: 2008-12-16 13:53
标题: 求助谁会UG二次开发的外部程序编写
用VS(2008)开发内部程序(DLL)的都可以运行,没问题。

但是做成exe,就是不行。也可以编译通过,但是一运行就崩溃。
将libufun.dll设成延迟加载,调试的时候装入就失败崩溃。
如果采用动态加载,UF_x等函数都定义成函数指针,采用LoadLibrary装入 libufun.dll 寻导出函数地址的方式。
调试状态下,使用 LoadLibrary ( libufun.dll )就会失败,返回模块句柄 NULL。
如果将生成的 exe 放到 ug2 的目录下运行,装入 LoadLibrary 会成功,也能得到 UF_initialize 的地址,但是一运行就崩溃

————好难办啊,谁会UG外部程序的开发?
我用的是UG5, VS2008,VS6 都试过都不行,直接控制台、MFC方式都试过,一样在初始化时候崩溃

各位,帮忙
作者: zzrxt    时间: 2008-12-16 19:21
是不是已经完成退出了啊,刚开始我也以为是崩溃了,后来觉得是代码运行完了,我用的是MFC,不知是不是你这种情况,进程中的ugraf启动到多少了才崩溃?
作者: jackie2003    时间: 2008-12-17 10:28
以前用VS2005做过一些复杂的例子,包括MFC的,都是可以的。

今天试了一下VS2008,NX5的,也没有问题。 源代码贴给你,希望能给些帮助。
函数将在你的D盘根目录下创建一个新的part.

注意,你在运行的时候,要设定好ugii_root_dir,并将其添加到path路径中。

#include <uf.h>
#include <uf_part.h>
#include <uf_cfi.h>

extern void main( char argc, char *argv[] )
{
    if( UF_initialize() )
    {
        std::cout << "UF_initialize Failed" << std::endl;
        return;
    }

    char part_name[256] = "d:\\testpart.prt";
   
    uc4561(part_name, 2);

    tag_t part_tag = NULL_TAG;
    int errorCode = UF_PART_new( part_name, 1, &part_tag );
    if( errorCode )
        std::cout << "New Part Failed" << std::endl;
    else
    {
        UF_PART_save();
        std::cout << "New Part Successful" << std::endl;
    }

    UF_terminate();
}
作者: stone_dong    时间: 2008-12-17 15:55
首先谢谢ls两位的回答,
但是实际上,我也使用了3楼的方法。
一运行就崩溃,
或者延迟加载 libufun.dll 库,但是只要一执行到 UF_initialize 就崩溃。

也就是说,执行程序是无法装入 libufun.dll 模块,各位没有出现个这个情况?

会不会是我的 ugs_common.dll 有问题(这个文件就是破解文件)。劳烦ls的大哥给我一份你的 lic 文件和 ugs_common.dll文件试试。
作者: stone_dong    时间: 2008-12-17 15:57
运行 ugraf.exe 没有问题,能正常操作,
包括运行 ugII/目录下的 .exe文件都没问题(命令行模式下运行)。
作者: jackie2003    时间: 2008-12-17 16:36
哈哈,lic和ugs_common.dll我没有办法帮你的了

我只能帮你验证方法正确与否

这个只能自己解决了
作者: stone_dong    时间: 2008-12-17 17:06
大哥,你是正版啊,还舍不得

UG程序已经可以启动,应该破解是没问题了
作者: zzrxt    时间: 2008-12-17 18:50
楼上的兄弟有没有用外部方式启动过nx manager(teamcenter 环境下的UG)呢?
作者: jackie2003    时间: 2008-12-18 10:34
有,我确认没有问题

注意要自己设置好tc启动环境
作者: stone_dong    时间: 2008-12-18 15:03
谢谢ls各位,问题已经解决了。

不是c++环境配置的问题,是我安装的NX5破解的问题。我用windbg跟踪汇编调试+手动延迟加载 都发现装载模块的时候在ugs_common.dll时候出现错误,应该是此dll装载函数里面有验证机制导致的装入模块时 998 错误崩溃。

希望此贴对做二次开发的兄弟有一点点帮助

我今天装了 nx4 就没问题了,exe文件可以运行,虽然初始化时间比较长,但毕竟成功了

——谢谢ls各位的帮助。
作者: zzrxt    时间: 2008-12-18 18:42
能请jackie2003兄弟帮我讲讲具体的设置做法吗?我想在外部模式下,通过启动TC环境下的UG,然后遍历我的HOME文件夹下的零组件对像,进行批量打印图纸的任务!事实上,我看UF_UGMGR_initialize()这个函数应该是可以初始化manager的,但每次初始都失败。还请兄弟帮忙。谢谢你了!
作者: jackie2003    时间: 2008-12-19 09:37
我测试过,在前面的代码上,设置输入参数,直接调用UF_UGMGR_initilize()就可以了

我查过该函数的帮助文档里面有例子程序,所以我想程序应该都没有问题的

1. 确认你是否可以正常启动TeamCenter
2. 确认你启动TeamCenter和你运行应用程序的环境设置是否一致,如tc_data, tc_root, fms_home 或者
3. 捕捉函数返回值,看有什么提示
作者: zzrxt    时间: 2008-12-19 18:46
谢谢兄弟!我明白你的意思了,先要把TC的服务启起来,再用这个初始化函数,可能就是这个原因吧!而我当初的做法是,在不启动TC的情况下,直接用这个函数初始化,显然会失败。我公司目前是可以不开TC,在UGmanagerj里能实现对TC数据的访问。那么,能不能做到在外部程序下,通过代码先启动TC_data服务,再初始化nxmanager呢?如果能做成这样,那该有多好,不开TC,不开UG,就能实现打印等功能。
作者: zzrxt    时间: 2008-12-19 18:49
另外,UF_UGMGR_initialize()里该传些什么参数进来?看了帮助文档,里面的参数并没有初始化啊,实在不知道该传些什么参数?还请您指点!谢谢!
作者: zzrxt    时间: 2008-12-20 08:58
再顶。。。。。
作者: zenghong789    时间: 2008-12-21 01:20
太复杂
作者: zzrxt    时间: 2008-12-22 18:19
再顶。。。。。
作者: zenghong789    时间: 2008-12-24 22:33

我的V6老是编译出问题,不知什么问题啊
作者: guangping    时间: 2011-1-18 21:35
搜到这个帖子,现在也要做UG的外部程序开发,也碰到这个问题,但可惜我现在找不到NX4了。。。。。。




欢迎光临 iCAx开思网 (https://www.icax.org/) Powered by Discuz! X3.3