【问题标题】:Converting a function from C++ to C#将函数从 C++ 转换为 C#
【发布时间】:2015-11-13 10:54:40
【问题描述】:

下面的sn-p可以转成C#.NET吗?

template <class cData>
cData Read(DWORD dwAddress)
{
    cData cRead; //Generic Variable To Store Data
    ReadProcessMemory(hProcess, (LPVOID)dwAddress, &cRead, sizeof(cData), NULL); //Win API - Reads Data At Specified Location 
    return cRead; //Returns Value At Specified dwAddress
}

当您想在 C++ 中从内存中读取数据时,这非常有用,因为它是通用的:您可以使用 Read&lt;"int"&gt;(0x00)"Read&lt;"vector"&gt;(0x00) 并将它们全部集成到一个函数中。

在 C#.NET 中,它对我不起作用,因为要读取内存,您需要具有预定义参数的 DLLImport ReadProcessMemory,这些参数当然不是通用的。

【问题讨论】:

  • 也许你可以使用这里建议的策略:stackoverflow.com/a/6336196/3150802。但不可否认,我不确定如何将它打包成一个简洁的一次性通用函数。也许会强制用于读取的类实现某种可序列化的接口。
  • 对于值类型(仅包含非托管数据的结构),您可能只使用内存地址作为指向结构的指针并返回该实例的副本,完全通用,带有 where T: struct 约束类型参数。
  • 在下面的新非“答案”中,您突然说您想要返回一个向量。你能澄清一下(当然是在这个原始帖子中)吗?这个问题很有趣,但如果给定地址有一个 int,我不明白为什么要生成一个向量。

标签: c# c++ generics readprocessmemory


【解决方案1】:

这样的东西不行吗?

using System.Runtime.InteropServices;

public static T Read<T>(IntPtr ptr) where T : struct
{
   return (T)Marshal.PtrToStructure(ptr, typeof(T));
}

这仅适用于结构,如果需要,您需要考虑像特殊的非通用情况一样编组字符串。

一个简单的检查看看它是否有效:

var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int)));
var three = 3;
Marshal.StructureToPtr(three, ptr, true);
var data = Read<int>(ptr);
Debug.Assert(data == three); //true

【讨论】:

    猜你喜欢
    • 2011-12-24
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多