当我尝试为一个用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。 任何帮助都将受到高度赞赏。
答案 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.dll
和SimpleActiveXControlLib.dll
。前者将包含System.Windows.Forms.Control
派生的包装器,用于ActiveX控件。将两者添加到项目中,然后尝试上面发布的代码(根据您发布的源代码进行更新)。