我有一个COM对象,我正在try 获取其实际底层地址,这样我就可以获得vtable的地址.我需要这是一个有效的数字地址,因为我需要能够添加到它.例如,如果我想调用vtable中的第三个函数,我需要能够调用如下内容:

Marshal.GetDelegateForFunctionPointer(vtableaddr + (3 * 8), ...);//第三项,64位模式下的8字节指针.

调用vtable中的第三个函数.

也就是说,我需要能够对指针地址进行加法运算.

我在问题标题中指定actual的原因是,所有获取底层对象地址的标准方法似乎都没有返回一个真正的地址.

var item = /*... my COM object */;
var pUnk = Marshal.GetIUnknownForObject(item);
var pVtbl = Marshal.ReadIntPtr(pUnk);

当运行这段代码时,pUnkpVtbl都会有非常大的数值.类似于0x1F3110D7948,即2,143,474,776,392.我的系统绝对没有两万亿字节的RAM.所以我假设指针在高位字节中包含附加信息?

我还try 了如下代码:

var gch = GCHandle.Alloc(pUnk, GCHandleType.Pinned);
var intptr = gch.AddrOfPinnedObject();
var pVtbl = Marshal.ReadIntPtr(intptr);

也会得到同样大的数字.拨打GCHandle.ToIntPtr(gch)也无济于事.

因此,我需要知道如何在内存中获取底层COM对象实际存储位置的real地址.

PS:我知道这是一种非标准的方式,但请理解,我绝对must能够通过这种方式为我正在工作的项目获得这些地址.这是一场关键的精彩表演.

推荐答案

请遵循这个方法.

var item = /*... my COM object */;
var pUnk = Marshal.GetIUnknownForObject(item);

// Get the address of the vtable
IntPtr pVtbl = Marshal.ReadIntPtr(pUnk);

// You may want to release the reference to the IUnknown if it's not needed anymore
Marshal.Release(pUnk);

// Now, you can perform arithmetic on the IntPtr to navigate the vtable
IntPtr thirdFunctionAddress = IntPtr.Add(pVtbl, 2 * IntPtr.Size); // Assuming 2 is the index of the third function

// Call the function using a delegate
var thirdFunction = (YourDelegateType)Marshal.GetDelegateForFunctionPointer(thirdFunctionAddress, typeof(YourDelegateType));
thirdFunction(/*... arguments ...*/);
  1. IntPtr.Size:IntPtr的大小取决于平台.在64位系统上,它通常是8字节,而在32位系统上,它是4字节.通过使用IntPtr.Size,您的代码变得更加独立于平台.

  2. IntPtr.Add:使用IntPtr.Add方法执行指针运算.此方法设计用于平台的指针大小.

  3. 释放IUNKNOWN:在COM中,最好在使用完后释放对IUNKNOWN接口的引用.这是使用Marshal实现的.释放.

Csharp相关问答推荐

在. net毛伊岛窗口的深度链接已经创建""

读取配置文件(mytest. exe. config)

如果存在对CodeAnalysis.CSharp的引用,则不能引用netStandard2.0库

如何使用C#Interop EXCEL创建度量衡

具有单一导航属性的EF核心一对多关系

Mongo作为.NET中Testcontainers的副本集

UWP中的任务和界面

在静态模式下实例化配置

C#阻塞调用或await calling inside calling方法

Docker Container中的HttpRequest后地址不可用

等待一个等待函数

我可以查看我们向应用程序洞察发送了多少数据吗?

在使用UserManager时,如何包含与其他实体的关系?

在C#ASP.NET内核中使用INT AS-1进行控制器场景的单元测试

为什么我的用户界面对象移动到略低于实际目标?

匿名类型的AbstractValidator

使用未赋值的、传递的局部变量

VS代码扩展无法在新版本扩展C#中运行从v2.10.28开始

Xamarin.Forms-如何创建可 Select 的显示alert 或弹出窗口?

在C#中通过Matheval使用自定义公式