无法运行非常简单的COM客户端

时间:2014-07-13 13:38:37

标签: c# visual-studio-2010 visual-c++ com com-interop

当我尝试为一个用C ++编写的非常简单的COM服务器运行一个非常简单的COM客户端时,我遇到了各种错误。 COM服务器是用C ++编写的,只有一个方法“GetSomeString”。我构建了COM服务器的ocx,使用regsrv32注册它,并从以下C#控制台应用程序引用它:

using MySimpleActivexControlLib;

namespace SimpleConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var c = new MySimpleActivexControlLib.MySimpleActivexControl();
            c.GetSomeString();
        }
    }
}

当我运行代码时,我得到以下异常:

  

未处理的类型异常   mscorlib.dll中出现'System.Runtime.InteropServices.COMException'

     

其他信息:灾难性故障(HRESULT的例外情况:   0x8000FFFF(E_UNEXPECTED))

我尝试使用C ++控制台应用程序中的组件,并收到另一个错误:

  

... Microsoft C ++异常:内存位置0x002bf5e4的_com_error   ...

可以查看完整代码here。 任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:3)

这当然取决于ActiveX控件中的内容,但是您没有显示任何代码。

,例如,控件可能需要STA线程运行并由ActiveX友好容器正确托管,这不是您的测试控制台应用程序所做的。从WinForms应用程序中尝试:

using System;
using System.Windows.Forms;
using AxSimpleActiveXControlLib;

class Program
{
    [STAThread]
    static void Main()
    {
        var c = new AxSimpleActiveXControlLib.AxSimpleActiveXControl();

        var form = new Form
        {
            Controls = { c }
        };

        form.Load += (s, e) => MessageBox.Show(c.GetSomeNumber().ToString());

        Application.Run(form);
    }
}

这也可能有所帮助:

How to create a HelloWorld COM Interop in Visual Studio 2012

更新,当您添加对MFC ActiveX控件的引用时,您应该通过Visual Studio WinForms工具箱添加它,或使用AxImp.exe工具:

AxImp.exe SimpleActiveXControl.ocx 

这样,它会生成AxSimpleActiveXControlLib.dllSimpleActiveXControlLib.dll。前者将包含System.Windows.Forms.Control派生的包装器,用于ActiveX控件。将两者添加到项目中,然后尝试上面发布的代码(根据您发布的源代码进行更新)。