如何调用 .Net COM+来自 C++ 的对象函数库?

发布于 2024-10-28 05:59:44 字数 846 浏览 3 评论 0原文

我还没有找到真正有效的例子。我需要为 MetaTrader 创建一个交互系统。最好使用 WCF 等现代技术或使用 C# 的其他技术,但 MetaTrader 根本不支持 COM 或仅支持 OOP。所以我需要一些网关组件,它必须是具有非对象接口的函数库。当然,它需要使用C++。但我没有成功地在网上找到一些如何从 C++ 函数库调用 C# COM+ DLL 的示例。我能找到的所有示例都使用 MetaTrader 不支持的组件 C++ 程序集。所以,我不能在 C++ 中使用命名空间等。我编写了一个 COM+ 服务器应用程序,可以通过以下几行轻松从 C# 调用

object c2 = Activator.CreateInstance(Type.GetTypeFromProgID("Imutome.COMPlusCache.Cache"));
c2.GetType().InvokeMember("OnTransfer", BindingFlags.InvokeMethod, null, c2, null);

但是当我尝试用 C++ 编写类似的内容时,

CLSIDFromProgID(OLESTR("Imutome.COMPlusCache.Cache"), &rclsid);
HRESULT hres = CoCreateInstance(rclsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&ppv);

我在 ppv 中只得到零,在 hres 中得到“0x80040154 类未注册”。我不确定需要什么标志或什么接口,但无论我尝试什么,我都会遇到相同的错误。尽管在 C# 中一切正常。请告诉我需要更改什么才能使 C++ 成功创建 COM+ 对象实例。

I've not found some example that really works. I need to create an interaction system for MetaTrader. It's better to use modern technologies like WCF or somehting else using C#, but MetaTrader doesn't support COM or just OOP at all. So I need some gateway component that must be functions library with non-object interface. Surely, it requires usage of C++. But I'm not succeeded to find over the Web some example how to call from a C++ functions library a C# COM+ DLL. All the examples I could find use component C++ assemblies that are not supported by MetaTrader. So, I can't use namespace, etc. in C++. I wrote a COM+ server application that is easy to call from C# by the following lines

object c2 = Activator.CreateInstance(Type.GetTypeFromProgID("Imutome.COMPlusCache.Cache"));
c2.GetType().InvokeMember("OnTransfer", BindingFlags.InvokeMethod, null, c2, null);

But when I'm trying to write in C++ something like this

CLSIDFromProgID(OLESTR("Imutome.COMPlusCache.Cache"), &rclsid);
HRESULT hres = CoCreateInstance(rclsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&ppv);

I get just zeros in ppv and "0x80040154 Class not registered" in hres. I'm not sure what flags or what interface are required but I get the same error whatever I try. Although in C# everything works. Tell me please what do I need to change to make C++ succesfully create a COM+ object instance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

九八野马 2024-11-04 05:59:44

我认为问题出在您注册组件的方式上。
你应该使用:

regasm your_component_name.dll /tlb
/代码库

regasm your_component_name.dll /tlb

并将您的组件库放入 GAC 或可执行位置。
希望这有帮助。
ComponentService GUI 不一样。

I believe the problem is in the way you register your component.
You shoud use:

regasm your_component_name.dll /tlb
/codebase

OR

regasm your_component_name.dll /tlb

AND put your component library to GAC or your executable location.
Hope this helps.
ComponentService GUI is not the same.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文