找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 656|回复: 8

[ARX函数]:请问如何在ARX里导出函数供其他普通dll模块使用

[复制链接]
发表于 2004-6-12 13:26:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
请问如何在ARX里导出函数供其他普通dll模块使用
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-6-12 19:01:55 | 显示全部楼层
在.def里输出看看。就象写dll一 样。arx本来就是一个dll
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-6-15 15:24:52 | 显示全部楼层
我用动态联结的办法调的。就是调不起来。到是肯定导出的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-16 11:37:46 | 显示全部楼层
1.动态加载
TCHAR dir[_MAX_DIR], drive[_MAX_DRIVE], arxPath[_MAX_PATH], fullpath[_MAX_PATH];
GetModuleFileName( _hdllInstance, fullpath, _MAX_PATH );
_tsplitpath(fullpath, drive, dir, NULL, NULL);
_tmakepath(arxPath, drive, dir, NULL, NULL);
CString dllName;
dllName.Format("%s%s",arxPath,"hcadImage.dll");       
_hLib=LoadLibrary(dllName);
if(_hLib==NULL)
{               
   acedAlert("not find hcadImage.dll");
   FreeLibrary(_hLib);
   return;
}

2. 调用例子
void setImageFileName(const CString& fileName)
{
     typedef bool (func)(const CString& fileName);
     func* f=(func*)GetProcAddress(_hLib,"setImageFileName");
    if(f==NULL)
    {               
       acedAlert("not find setImageFileName function");       
      return;
    }
   (*f)(fileName);       
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-6-18 11:27:00 | 显示全部楼层
谢谢楼上的,可是我的问题不是你所说的那样的。
是其他exe文件调用arx里导出的函数。谢谢哪位帮我看看吧。
//////////////////////////
//   yy.arx
////////////////////////////////////////////////////
void g_Function(){
        acedAlert("acad hello");
}

extern "C"
AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg,void* pkt)
{
        switch(msg)
        {
        case AcRx::kInitAppMsg:{
                        acrxDynamicLinker->unlockApplication(pkt);
                        acrxRegisterAppMDIAware(pkt);
                        acedRegCmds->addCommand("ASDK_SAMPLE_COMMAND",
                                "HELLO","HELLO",ACRX_CMD_MODAL,g_Function);               
                }
                break;
        case AcRx::kUnloadAppMsg:
                {
                        acedRegCmds->removeGroup("HELLO");
                }
                break;
        case AcRx::kLoadDwgMsg:
                break;

        }
        return AcRx::kRetOK;
}
//////////////////////////////////////////////////////////////////////////////////////////////
当然在def里把g_Function导出了.
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////
//yy.exe
//////////////////////////////////////////////
void CyyDlg::OnBnClickedButton1()
{
        HINSTANCE hInstance = AfxLoadLibrary("yy.arx");
        typedef void (*pFun)();
        pFun pfun;

        if(hInstance)
        {
                pfun = (pFun)GetProcAddress(hInstance,"g_Function");
                pfun();
                AfxFreeLibrary(hInstance);
        }
        else
        {
        AfxMessageBox("Fail");
        }

}

/////////////////////////////////////////////////////////////////
出错现象:调试发现可以到g_Function里面,但是在运行到acedAlert("acad hello")时出错

还有,我得CAD启动自动加载yy.arx的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-22 08:14:36 | 显示全部楼层
当然不行,acedAlert要使用AutoCAD的资源。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-6-26 09:51:10 | 显示全部楼层
问7楼:那如果我切换资源就可以了吗?

切换资源大概没有办法,但是不知道调用不使用资源的函数可不可以呢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-1 13:04:26 | 显示全部楼层
按照正常的.def法导出,只是到处是要注意:
对于ARX14,应先导出下面函数(注意设置序号):
_SetacrxPtp       @1
acrxEntryPoint    @2
acrxGetApiVersion @3       
后面跟自定义导出函数,可不加序号
对于ARX15以及以后版本:
acrxEntryPoint        @1 PRIVATE
acrxGetApiVersion        @2 PRIVATE
后面跟自定义导出函数,可不加序号.

以上可看出,自定义导出函数/变量必须位于固有导出函数之后,因为AutoCAD总是按照固定的序号调用ARX的固有接口函数!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-5 22:58:40 | 显示全部楼层
如果你导出函数没有用到任何ObjectArx函数, 你是可以做到的(LoadLibrary / GetProcAddress / FreeLibrary),不过这又有什么意义?还不如写一个纯粹的dll。

我猜想你的真实想法是让另一个Exe控制Acad吧? 用COM吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-15 21:57 , Processed in 0.401880 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表