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

标签 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();
        }
    }
}

当我运行代码时,出现以下异常:

An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in mscorlib.dll

Additional information: Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))

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

... Microsoft C++ exception: _com_error at memory location 0x002bf5e4 ...

完整代码可查看here 。 任何帮助将不胜感激。

最佳答案

这当然取决于 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。前者将包含 ActiveX 控件的 System.Windows.Forms.Control 派生包装器。将两者添加到您的项目中,然后尝试我上面发布的代码(根据您发布的源代码进行更新)。

关于c# - 无法运行非常简单的 COM 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24723272/

相关文章:

c# - 没有为 ListView 启用 ScrollViewer

c# - 扩展无构造函数类

asp.net - 如何在不编译、不复制SVN文件的情况下发布完整的网站

c++ - 在没有visual studio的电脑上运行opencv dll

c++ - 如何通过预处理器指令检查程序是否需要 Visual C++ 中的预编译头文件?

c# - InflaterInputStream.Read 导致错误

visual-studio-2010 - 编写 VS2010 扩展

c++ - Microsoft Visual Studio (2008) - 解决方案资源管理器中的过滤器

C++ 命名约定

c# - 如何配置 EF Code First 以不映射特定类型?