VB.NET调用ARX程序创建的COM Server

首先,我们看如何用VS 2005(英文)来创建一个ARX COM Server并暴露一个接口供后面的程序调用。

  1. 新建一个工程,选择用ObjectARX向导创建工程,取名字为comServerFromArx,按OK按钮。
  1. 在出现的对话框中左边选项中选择COM Options,在右边的选项中选择使用ATL来实现COM Server,按Finish按钮。
  1. 在工程上点右健菜单选择Add->Class…菜单命令。
  1. 在左边选择ATL,右边选择ATL Simple Object,按Add按钮继续。
  1. 再输入接口的名称,例如myCustomCom(如下图),按Finish按钮退出。

至此,一个ARX COM Server和一个接口已经创建好了。现在给我们的接口增加一个函数getPosition。

  1. 在接口ImyCustomCom上面点鼠标右健->Add->Add Method…菜单命令。
  1. 如下图,依次填入函数名称和参数信息,按下面的Finish退出。
  1. 现在如果你搜索getPosition函数,应该会得到三个结果:

即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(库文件)文件夹的路径。编译工程,成功通过为止。

  1. 最后一步是到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。

  1. 创建一个VB.NET的Windows Application程序,命名为comClient,按OK按钮退出。
  1. 一个带有一个Form1的Windows Application创建了。在Form1的界面上增加一个按钮。
  1. 鼠标双击Form1中的Button1,开始添加一些代码以实现调用我们前面创建的Com Server。下面是源代码:

上面的代码很简单,我想需要解释的一点,可能是,我们不能通过new myCustomCom来创建这个Com接口,因为我们的ARX程序是一个AutoCAD的插件,也就是说是一个进程内(in-process)的Com Server,必须通过AcadApplication的GetInterfaceObject来获取。

  1. 按F5执行该程序,结果会看到一个消息框显示程序从Com Server的接口中获取的数据。

就这么简单!

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...