【问题标题】:Exposing a managed COM local server - E_NOINTERFACE公开托管 COM 本地服务器 - E_NOINTERFACE
【发布时间】:2011-02-02 10:11:37
【问题描述】:

我试图将用 C# 编写的本地服务器公开给非托管代码以允许互操作!托管代码如下所示:

[Guid("A0D470AF-0618-40E9-8297-8C63BAF3F1C3")] [ComVisible(true)] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IMyLocalInterface { void LogToServer(string message); } [Guid("9E9E5403-7993-49ED-BAFA-FD9A63A837E3")] [ComVisible(true)] [ClassInterface(ClassInterfaceType.None)] public class MyLocalClass : IMyLocalInterface { public MyLocalClass() { Console.WriteLine("Object created!"); } public void LogToServer(string message) { Console.WriteLine("Log > " + message); } } class Program { [MTAThread] static void Main(string[] args) { var srv = new RegistrationServices(); var cookie = srv.RegisterTypeForComClients(typeof(MyLocalClass), RegistrationClassContext.LocalServer | RegistrationClassContext.RemoteServer, RegistrationConnectionType.MultipleUse); Console.ReadLine(); srv.UnregisterTypeForComClients(cookie); } }

我的非托管代码执行以下操作:

#import "ManagedLocServer.tlb" no_namespace raw_interfaces_only int _tmain(int argc, _TCHAR* argv[]) { CoInitializeEx(NULL, COINIT_MULTITHREADED); { IMyLocalInterfacePtr ptr; ptr.CreateInstance(__uuidof(MyLocalClass)); ptr->LogToServer(L"Initializing..."); } CoUninitialize(); return 0; }

调试后我发现 CoCreateInstance 没有任何问题,这意味着“对象已创建”被打印到托管服务器控制台中。但随后该对象上的 QueryInterface 因 E_NOINTERFACE 而失败。我有点困惑为什么会发生这种情况。注册是否有问题(我的 CLSID 只有一个 LocalServer32 条目)?这是我的托管代码中的问题吗?如果有人能给我一个提示会很好:)

问候 乔

【问题讨论】:

    标签: com interop localserver


    【解决方案1】:

    您正在使用进程外 COM。这需要编组支持,使方法调用需要序列化方法的参数。这通常通过从 .idl 文件中的 midl.exe 生成的代码构建代理/存根 DLL 来完成。或者通过使用与类型库一起使用的标准编组器。两者都需要 HKCR\Interface 中的注册表项

    您得到 E_NOINTERFACE 因为 COM 找不到编组器。如果你有一个 .idl 文件但你没有,这很容易解决,服务器是在 .NET 中实现的。不知道如何解决这个问题,我从来没有尝试过这个工作。一个遥远的可能性是 CLR 互操作层提供编组支持。但是您肯定至少必须使用 ComInterfaceType.InterfaceIsDual。这只是一个猜测。如果我尝试完成这项工作,我会先从 .idl 开始。

    【讨论】:

    • 也许他可以尝试使用regasm /tlb 生成一个类型库,然后在注册表中注册该类型库,从而免费获得自动化编组?
    • @sharp - 我不知道,这个工具已经很久没用了。至少在我的机器上,它以 regtlibv12.exe 的名称回到 .NET 4.0 中。根本没有文档,甚至 /?帮助,我不知道它是做什么的。我希望它写信给 HKCR\TypeLib,但在 HKCR\Interface 中写所需的条目让我觉得不太可能,因为这可能会弄乱现有的注册。
    猜你喜欢
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 2014-08-01
    • 2016-04-25
    相关资源
    最近更新 更多