代码之家  ›  专栏  ›  技术社区  ›  Daniël J

使用GUI制作COM服务器的最佳实践是什么?

  •  0
  • Daniël J  · 技术社区  · 6 年前

    上下文 :

    我正在使用一些旧的机器人软件,如果COM对象实现了一些预定义的接口,它就能够从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类访问表单。我尝试通过构造函数将表单传递给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。

    我如何解决这个问题?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Daniël J    6 年前

    此解决方案解决了上述两个问题:都是 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();
            }
    }
    

    我想强调的是,这解决了 现在 ,如果一切正常,我会尝试更新此帖子。