【问题标题】:Accessing a com object's vtable in c#在 C# 中访问 c​​om 对象的 vtable
【发布时间】:2010-04-23 06:56:29
【问题描述】:

编辑:

我正在尝试将第 3 方 com 对象封装在 .net 类中,同时修复它的错误。我希望通过调用我自己的方法来替换 com 对象的 vtable 中的方法,这将提供该方法的无错误实现。

我试图在一些非常基本的东西上对此进行测试,但鉴于下面的答案,我完全走错了路。通过创建对我的 com 对象的引用,我假设我已经创建了一个运行时可调用包装器,有没有办法获得指向真正底层 com 对象的指针?


我正在尝试访问内存中 com 对象的 vtable,但无处可去。

根据我的阅读,com 对象内存中的前 4 个字节应该是指向 vtableptr 的指针,而 vtableptr 又是指向 vtable 的指针。

虽然我不确定我是否希望在这个 com 对象的插槽 7 中找到我的测试方法,但我已经尝试了所有方法,但没有任何东西看起来像我的函数的地址。

如果有人可以对此示例进行必要的更改以使其正常工作(目的只是尝试通过访问 com 对象的 vtable 并将该方法定位在它出现的任何行中来调用 Tester 类上的 Test 方法) 我将不胜感激。

我知道很少有人需要这样做,但请接受我确实需要做一些非常相似的事情并考虑过替代方案

提前致谢

[ComVisible(true)]
public class Tester
{
    public void Test()
    {
        MessageBox.Show("Here");
    }

}

public delegate void TestDelegate();

private void main()
{

    Tester t = new Tester();

    GCHandle objectHandle = GCHandle.Alloc(t);

    IntPtr objectPtr = GCHandle.ToIntPtr(objectHandle);

    IntPtr vTable = (IntPtr)Marshal.ReadInt32(objectPtr);

    IntPtr vTablePtr = (IntPtr)Marshal.ReadInt32(vTable);

    IntPtr functionPtr = (IntPtr)Marshal.ReadInt32(vTablePtr, 7 * 4); // 7 may be incorrect but i have tried many different values

    TestDelegate func = (TestDelegate)Marshal.GetDelegateForFunctionPointer(functionPtr, typeof(TestDelegate));

    func();

    objectHandle.Free();
}

【问题讨论】:

    标签: c# .net com


    【解决方案1】:

    你完全走错了轨道。 t 对象不是 COM 接口指针,它是一个 .NET 对象引用。在非托管代码创建CCW(COM Callable Wrapper)之前,不会创建COM 接口指针(及其v-table)。它必须是非托管代码,CLR 互操作层不允许托管代码创建 CCW。

    让这个话题继续前进的唯一方法是解释你为什么要这样做。

    【讨论】:

    • 感谢 Hans 的解释,我在这里肯定超出了我的深度,这节省了我浪费时间在一些永远不会工作的事情上。我已经用更多信息更新了我的问题,以防有人可以提供建议
    【解决方案2】:

    @Hans 有道理。 +1。

    这绝不是一个解决方案,只是一个解释:

    如果你真的想访问一个 COM 对象,为什么不创建一个简单的 COM dll 然后尝试访问它呢?

    互操作有两种工作方式:

    1. .NET组件调用COM组件
    2. COM 组件调用 .NET 组件

    当 .NET 调用 COM 时,它需要 Runtime Callable Wrapper(Visual Studio 将为您创建)和 COM Callable Wrapper(需要用 ComVisible 装饰 .NET 成员)用于后者。

    要从 .NET 访问 COM 对象的 vtable,它必须是您正在访问的真实 COM 组件,否则它只是 @Hans 提到的对象引用。

    【讨论】:

      猜你喜欢
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 1970-01-01
      • 2013-01-14
      • 1970-01-01
      • 2021-02-26
      • 2011-06-07
      相关资源
      最近更新 更多