【问题标题】:COM Interops InvalidCastException with IGroupPolicyObjectCOM 互操作 InvalidCastException 与 IGroupPolicyObject
【发布时间】:2012-06-18 00:39:35
【问题描述】:

我已经使用 COM 定义了以下类,以使用 C#.NET 使用 IGroupPolicyObject:

 [ComImport, Guid("EA502722-A23D-11d1-A7D3-0000F87571E3")]
    public class GPClass
    {
        // The C# compiler will add a parameterless constructor that we will call          // to create an instance of the COM coclass.
    }


   [ComImport, Guid("EA502723-A23D-11d1-A7D3-0000F87571E3"),  
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]  
    public interface IGroupPolicyObject  
    {  
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords")]  
        void New(  
            [MarshalAs(UnmanagedType.LPWStr)] string domainName,  
            [MarshalAs(UnmanagedType.LPWStr)] string displayName,  
            uint flags);  

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly")]  
        void OpenDsgpo(  
            [MarshalAs(UnmanagedType.LPWStr)] string path,  
            uint flags);  

        void OpenLocalMachineGpo(  
            uint flags);  

        void OpenRemoteMachineGpo(  
            [MarshalAs(UnmanagedType.LPWStr)] string computerName,  
            uint flags);  

        void Save(  
            [MarshalAs(UnmanagedType.Bool)] bool machine,  
            [MarshalAs(UnmanagedType.Bool)] bool add,  
            [MarshalAs(UnmanagedType.LPStruct)] Guid extension,  
            [MarshalAs(UnmanagedType.LPStruct)] Guid app);  

        void Delete();  

        void GetName(  
            [MarshalAs(UnmanagedType.LPWStr)] StringBuilder name,  
            int maxLength);  

        void GetDisplayName(  
            [MarshalAs(UnmanagedType.LPWStr)] StringBuilder name,  
            int maxLength);  

        void SetDisplayName(  
            [MarshalAs(UnmanagedType.LPWStr)] string name);  

        void GetPath(  
            [MarshalAs(UnmanagedType.LPWStr)] StringBuilder path,  
            int maxPath);  

        void GetDSPath(  
            uint section,  
            [MarshalAs(UnmanagedType.LPWStr)] StringBuilder path,  
            int maxPath);  

        void GetFileSysPath(  
            uint section,  
            [MarshalAs(UnmanagedType.LPWStr)] StringBuilder path,  
            int maxPath);  

        IntPtr GetRegistryKey(uint section);  

        uint GetOptions();  

        void SetOptions(  
            uint options,  
            uint mask);  

        void GetMachineName(  
            [MarshalAs(UnmanagedType.LPWStr)] StringBuilder name,  
            int maxLength);  

        uint GetPropertySheetPages(  
            out IntPtr pages);  
    }

问题是当我尝试按如下方式使用 IGroupPolicyObject 时,我得到一个 InvalidCastException:

GPClass gpClass = new GPClass();
IGroupPolicyObject comGroupPolicyObject = (IGroupPolicyObject)gpClass;

我得到的例外是: 无法将“ConfigureRemoteSources.GPClass”类型的 COM 对象转换为接口类型“ConfigureRemoteSources.IGroupPolicyObject”。此操作失败,因为 IID 为“{EA502722-A23D-11D1-A7D3-0000F87571E3}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:不支持此类接口(来自 HRESULT 的异常:0x80004002 (E_NOINTERFACE)) .

关于如何解决这个问题的任何想法? 谢谢

【问题讨论】:

    标签: c# .net windows com group-policy


    【解决方案1】:

    您可以通过 Regedit.exe、HKCR\CLSID\{EA502722-A23D-11D1-A7D3-0000F87571E3}\InProcServer32 键找到它。其中包含 ThreadModel 值,它设置为“Apartment”。这意味着 coclass 不是线程安全的,它必须从单线程单元中调用。您会认出首字母缩略词,这就是 STA 在 [STAThread] 中的意思。

    HKCR\Interface 中通常还有一个键,它声明代理/存根 DLL,用于编组跨单元的接口调用。但那是缺失的。这就是错误消息的真正含义,COM 创建了一个 separate 线程来为组件提供一个安全的家,但是它找不到编组调用的方法。 Microsoft 只是没有打扰,这个 coclass 通常通过运行组策略编辑器 gpedit.msc 从 MMC 中使用。您必须为这个非线程安全组件提供一个类似的安全主页,即一个泵送消息循环的 STA 线程。 GUI 程序的 UI 线程。您使用属性处理了 STA,可能不是消息循环。如果您注意到死锁,那么您可能会侥幸逃脱。

    【讨论】:

      【解决方案2】:

      这篇文章似乎有一些干净的东西,但我无法让它工作。我通过在 main 方法中添加 [STAThread] 解决了这个问题。 (using System.Threading;)

      【讨论】:

        猜你喜欢
        • 2014-09-03
        • 2011-07-02
        • 2011-04-11
        • 2010-12-14
        • 1970-01-01
        • 2011-04-13
        • 2011-11-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多