使用 GUI 制作 COM 服务器的最佳实践是什么?
What is the best practise for making a COM server with a GUI?
上下文:
我正在使用一些旧的机器人软件,如果它实现了一些预定义的接口,它能够从 COM 对象获取信息。由于这个旧软件在 Windows 2000 上运行,我想使用 DCOM 来(尝试)避免为 Windows 2000 编译一些东西。(我知道必须调用的程序可能需要也可以在 Windows 2000 计算机上工作,或者至少存在)
另一台计算机将通过 DCOM 调用,并使用一组配置的步骤处理图像。我想要一个 GUI 来显示传入和传出图像以及更改它所执行的步骤的能力。
问题
图像处理器需要实现两个接口,但接口 1 包含一个 Load
函数,Form
也是如此,但两者都需要保持可访问性,所以我认为我不能使用new
关键字。因此下面的代码将不起作用。
public class ServerForm : Form, Interface1, Interface2 { }
我可以这样拆分它们:
public class ServerForm : Form { }
public class MyImageProcessor : Interface1, Interface2 { }
但我仍然需要从 MyImageProcessor class 访问表单。我尝试通过构造函数将表单传递给 MyImageProcessor,如下所示:
static class Program {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
ServerForm sv = new ServerForm();
MyImageProcessor mip = new MyImageProcessor(sv);
Application.Run(sv);
}
}
但是当我使用 regasm CSharpServer.exe /regfile:CSharpServer.reg
检查注册表中添加了哪些项时,只显示 ServerForm 而不是 ImageProcessor。
我该如何解决这个问题?
此解决方案修复了上述两个问题:两个 load
函数将保持可用并生成正确的注册表项,但我不会这样做是否会在以后给 COM 带来任何问题。 (可能会)
我把它一分为二类。 ServerForm 是从 MyImageProcessor
.
的构造函数生成的 运行
public class MyImageProcessor : Interface1, Interface2{
private static ServerForm sv;
public MyImageProcessor () {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
sv = new ServerForm();
Application.Run(sv);
}
}
和
public class ServerForm : Form {
public ServerForm() {
InitializeComponent();
}
}
我想强调一下,这解决了 现在 的问题,如果一切正常,我会尝试更新此 post。
上下文:
我正在使用一些旧的机器人软件,如果它实现了一些预定义的接口,它能够从 COM 对象获取信息。由于这个旧软件在 Windows 2000 上运行,我想使用 DCOM 来(尝试)避免为 Windows 2000 编译一些东西。(我知道必须调用的程序可能需要也可以在 Windows 2000 计算机上工作,或者至少存在)
另一台计算机将通过 DCOM 调用,并使用一组配置的步骤处理图像。我想要一个 GUI 来显示传入和传出图像以及更改它所执行的步骤的能力。
问题
图像处理器需要实现两个接口,但接口 1 包含一个 Load
函数,Form
也是如此,但两者都需要保持可访问性,所以我认为我不能使用new
关键字。因此下面的代码将不起作用。
public class ServerForm : Form, Interface1, Interface2 { }
我可以这样拆分它们:
public class ServerForm : Form { }
public class MyImageProcessor : Interface1, Interface2 { }
但我仍然需要从 MyImageProcessor class 访问表单。我尝试通过构造函数将表单传递给 MyImageProcessor,如下所示:
static class Program {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
ServerForm sv = new ServerForm();
MyImageProcessor mip = new MyImageProcessor(sv);
Application.Run(sv);
}
}
但是当我使用 regasm CSharpServer.exe /regfile:CSharpServer.reg
检查注册表中添加了哪些项时,只显示 ServerForm 而不是 ImageProcessor。
我该如何解决这个问题?
此解决方案修复了上述两个问题:两个 load
函数将保持可用并生成正确的注册表项,但我不会这样做是否会在以后给 COM 带来任何问题。 (可能会)
我把它一分为二类。 ServerForm 是从 MyImageProcessor
.
public class MyImageProcessor : Interface1, Interface2{
private static ServerForm sv;
public MyImageProcessor () {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
sv = new ServerForm();
Application.Run(sv);
}
}
和
public class ServerForm : Form {
public ServerForm() {
InitializeComponent();
}
}
我想强调一下,这解决了 现在 的问题,如果一切正常,我会尝试更新此 post。