当我尝试为我用 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.dll
和SimpleActiveXControlLib.dll
。前者将包含 ActiveX 控件的 System.Windows.Forms.Control 派生包装器。将两者添加到您的项目中,然后尝试我上面发布的代码(根据您发布的源代码进行更新)。
关于c# - 无法运行非常简单的 COM 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24723272/