- UID
- 132971
- 积分
- 0
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2004-5-2
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
在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的一个界面
最后返回这个界面操作的结果 |
|