【发布时间】: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();
}
【问题讨论】: