如何在C#中调用虚函数在COM

问题描述 投票:0回答:1

我是新来的COM和C#。我所试图做的是重写在C#以下来源:

explife.c

explife.h

typedef interface IARPUninstallStringLauncher IARPUninstallStringLauncher;

typedef struct IARPUninstallStringLauncherVtbl {

BEGIN_INTERFACE

    HRESULT(STDMETHODCALLTYPE *QueryInterface)(
        __RPC__in IARPUninstallStringLauncher * This,
        __RPC__in REFIID riid,
        _COM_Outptr_  void **ppvObject);

    ULONG(STDMETHODCALLTYPE *AddRef)(
        __RPC__in IARPUninstallStringLauncher * This);

    ULONG(STDMETHODCALLTYPE *Release)(
        __RPC__in IARPUninstallStringLauncher * This);

    HRESULT(STDMETHODCALLTYPE *LaunchUninstallStringAndWait)(
        __RPC__in IARPUninstallStringLauncher * This,
        _In_ HKEY hKey,
        _In_ LPCOLESTR Item,
        _In_ BOOL bModify,
        _In_ HWND hWnd);

    HRESULT(STDMETHODCALLTYPE *RemoveBrokenItemFromInstalledProgramsList)(
        __RPC__in IARPUninstallStringLauncher * This,
        _In_ HKEY hKey,
        _In_ LPCOLESTR Item);

END_INTERFACE

} *PIARPUninstallStringLauncherVtbl;

interface IARPUninstallStringLauncher
{
  CONST_VTBL struct IARPUninstallStringLauncherVtbl *lpVtbl;
};

从我的理解,他在这个界面翻转功能,并创建了一个结构,这样他就可以达到这个虚函数的地址。

在这个COM的功能是不是在OLEVIEW可见,也是我不能在VisualStudio中导入。

我的问题是,有可能把它写在C#中?

c# com virtual-functions oleview
1个回答
1
投票

这将是一个C#等效(你不需要定义IUnknown方法,并且this是隐含的):

[Guid("F885120E-3789-4FD9-865E-DC9B4A6412D2"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IARPUninstallStringLauncher
{
    [PreserveSig]
    int LaunchUninstallStringAndWait(
            IntPtr hKey,
            [MarshalAs(UnmanagedType.LPWStr)] string Item,
            bool bModify,
            IntPtr hWnd);

    [PreserveSig]
    int RemoveBrokenItemFromInstalledProgramsList(
        IntPtr hKey,
        [MarshalAs(UnmanagedType.LPWStr)] string Item);
}

你可以声明这样的组件类(是的,一个空体)

[Guid("FCC74B77-EC3E-4DD8-A80B-008A702075A9"), ComImport]
public class UninstallStringLauncher
{
}

而创建和使用的对象,你可以尝试这样的代码

var launcher = (IARPUninstallStringLauncher)new UninstallStringLauncher();

并确保您的COM对象的位数(86/64)您的C#应用​​程序的位数相匹配。

© www.soinside.com 2019 - 2024. All rights reserved.