首先,我们看如何用VS 2005(英文)来创建一个ARX COM Server并暴露一个接口供后面的程序调用。
- 新建一个工程,选择用ObjectARX向导创建工程,取名字为comServerFromArx,按OK按钮。
- 在出现的对话框中左边选项中选择COM Options,在右边的选项中选择使用ATL来实现COM Server,按Finish按钮。
- 在左边选择ATL,右边选择ATL Simple Object,按Add按钮继续。
至此,一个ARX COM Server和一个接口已经创建好了。现在给我们的接口增加一个函数getPosition。
- 在接口ImyCustomCom上面点鼠标右健->Add->Add Method…菜单命令。
即comServerFromArx.idl文件中的:
interface ImyCustomCom : IDispatch{
[id(1),helpstring("method getPosition")] HRESULT getPosition([out] FLOAT* X,[out] FLOAT* Y,[out] FLOAT* Z);
};
myCustomCom.h文件中的:
public:
STDMETHOD(getPosition)(FLOAT* X,FLOAT* Y,FLOAT* Z);
以及myCustomCom.cpp文件中的getPosition函数体。在该函数中给参数一些数据。这只是做个示范,没有实际意义。在现实工程中你可以调用ARX接口来实现更复杂的逻辑。
编译工程。应该一切都OK。如果你没有设置好头文件和库文件的地址,可以通过如下Tools->Optins->Projects and Solutions->VC++ Directories来简单的进行设置:
先选择Include files然后ObjectARX的inc(头文件)文件夹的路径,再依葫芦画瓢,选择Library files来增加ObjectARX的lib(库文件)文件夹的路径。编译工程,成功通过为止。
- 最后一步是到AutoCAD中加载我们的.arx程序——在命令行输入appload,找到上面编译了的.arx文件,加载文件。这一步会自动注册我们的Com接口(.tlb文件)。其实是ARX程序加载后通过执行CcomServerFromArxApp类中的RegisterServerComponents函数实现的。该函数如下:
virtual void RegisterServerComponents () {
//----- Self-register COM server upon loading.
if ( Failed(::DllRegisterServer ()) )
acutPrintf (_RXST("Failed to register COM server./n")) ;
}
下一步,我们用VB.NET来制作一个Com Client。
- 创建一个VB.NET的Windows Application程序,命名为comClient,按OK按钮退出。
- 一个带有一个Form1的Windows Application创建了。在Form1的界面上增加一个按钮。
上面的代码很简单,我想需要解释的一点,可能是,我们不能通过new myCustomCom来创建这个Com接口,因为我们的ARX程序是一个AutoCAD的插件,也就是说是一个进程内(in-process)的Com Server,必须通过AcadApplication的GetInterfaceObject来获取。
就这么简单!