找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 269|回复: 0

[弹指神通]:利用com技术在arx程序中调用vb 的动态连接库里面的函数

[复制链接]
发表于 2004-5-19 16:19:26 | 显示全部楼层 |阅读模式

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

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

×
在vc中创建应用复杂的dialog实在是个非常麻烦的事情,实际上我们可以利用vb界面定制的方便性,利用com接口技术在vc中直接调用vb动态库的函数,从而简化程序的复杂性。我是arx初学者,以后希望能够得到大家的帮助,下面是我在vc里面调用vb动态链接库的经验

1。
#import "AcadDialog.dll"
using namespace AcadDialog;

上面2行代码必须放在一个class的头文件里面,比如下面头文件
// AcadArx.h: interface for the AcadArx class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_ACADARX_H__6FAF95FD_45F6_419C_9794_8B0B875D47CE__INCLUDED_)
#define AFX_ACADARX_H__6FAF95FD_45F6_419C_9794_8B0B875D47CE__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#import "AcadDialog.dll"
using namespace AcadDialog;

class AcadArx  
{
public:
        AcadArx();
        virtual ~AcadArx();

};

#endif // !defined(AFX_ACADARX_H__6FAF95FD_45F6_419C_9794_8B0B875D47CE__INCLUDED_)



//BOOL                                OutOfProcess = TRUE;

#include<aced.h>
#include<rxregsvc.h>
#include<ads.h>
#include<adslib.h>
#include<dbents.h>
#include<dbsymtb.h>
#include<OAIDL.H>
#include<windows.h>

2。vc中的调用
下面代码调用vb动态链接库的一个函数显示一个dialog,,这段代码只做一个简单的操作,传给vb一个路径,vb中在这个路径下选中一个dwg文件然后返回文件名的全路经,然后插入这个一个块。功能简单,只是为了让大家更容易理解如何调用vb动态库的函数
void InsertTitleBlock(void)
{
char filepath[512];//取应用程序路径
DWORD pathLength = GetModuleFileName(GetModuleHandle("test.arx"), filepath, 512);
if (pathLength)
{
   filepath[pathLength-15]=NULL;
  strcat(filepath,"TitleBlock");
}

        HRESULT hresult;
CLSID clsid;
CoInitialize(NULL);   
//初始化COM接口
hresult=CLSIDFromProgID(OLESTR("AcadDialog.Fun"), &clsid);   
_Fun *t;
hresult=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(_Fun),(LPVOID *) &t);
if(FAILED(hresult))
{
        //如果初始化失败,退出程序
       return;
}     


_variant_t is_VARIANT;
_bstr_t bs;
bs=filepath;
is_VARIANT=t->ShowSelectTitleBlock(bs); //调用vb的函数,并且得到他的返回值
bs=is_VARIANT;
CoUninitialize();  

//  关闭COM库的联接,调用服务组件完成

if (strcmp(bs,"")!=0)
{
       
      
ads_command(RTSTR,"insert",RTSTR,tmpfile,0);

                 
}
        return;
}

3。vb中编写一个dll程序
工程名=AcadDialog
建立一个class,class名=Fun
然后在这个类里面写函数
Public Function ShowSelectTitleBlock(ByVal FilePath As String)
  PublicBL.FilePath = FilePath
  FrmSelectTitle.Show 1
  ShowSelectTitleBlock = PublicBL.FilePath
End Function

上面这段代码接收vc里面传过来的路径,然后调用vb的一个界面
最后返回这个界面操作的结果
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-9-21 18:57 , Processed in 0.277060 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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