COM Interops InvalidCastException with IGroupPolicyObject

本文关键字:IGroupPolicyObject with InvalidCastException Interops COM | 更新日期: 2023-09-27 18:37:20

我使用 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"。此操作失败,因为 COM 组件上对具有 IID"{EA502722-A23D-11D1-A7D3-0000F87571E3}"的接口的 QueryInterface 调用失败,原因是出现以下错误:不支持此类接口(HRESULT 例外:0x80004002 (E_NOINTERFACE))。

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

COM Interops InvalidCastException with IGroupPolicyObject

您可以使用

Regedit.exe,HKCR''CLSID''{EA502722-A23D-11D1-A7D3-0000F87571E3}''InProcServer32密钥找到它。 其中包含 ThreadModel 值,它被设置为"公寓"。 这意味着 coclass 不是线程安全的,它必须从单线程单元调用。 你会认出首字母缩略词,这就是 STA 在 [STAThread] 中的意思。

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

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

相关文章:
  • 没有找到相关文章