0

我进行此转换的主要目的是根据内存地址在 C# 中创建一个对象......它会不会太 hack-ish(或完全不正确/愚蠢)?如果是这样,有没有更好的方法来做到这一点?

像这样的东西:

int app_handle = 920663024; // corresponds to memory location 0x36E033F0
string app_handle_converted_to_hex = decValue.ToString("X");
MyAppClass *newApp = (MyAppClass *)app_handle_converted_to_hex;

此外,这是否可能在不使用指针的情况下完成?

4

2 回答 2

1

您将要使用Marshal.PtrToStructurewhich 假定顺序布局。

查看页面底部的示例。

此代码假定为 32 位编译。在使用 64 位编译器之前,请将 IntPtr.ToInt32 替换为 IntPtr.ToInt64。

[StructLayout(LayoutKind.Sequential)]
public class INNER
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst =  10)]
    public string field1 = "Test";
}   

[StructLayout(LayoutKind.Sequential)]
public struct OUTER
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst =  10)]
    public string field1;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst =  100)]
    public byte[] inner;
}

[DllImport(@"SomeTestDLL.dll")]
public static extern void CallTest( ref OUTER po);

static void Main(string[] args)
{
    OUTER ed = new OUTER();
    INNER[] inn = new INNER[10];
    INNER test = new INNER();
    int iStructSize = Marshal.SizeOf(test);

    int sz =inn.Length * iStructSize;
    ed.inner = new byte[sz];

    try
    {
        CallTest( ref ed);
    }
    catch(Exception e)
    {
        Console.WriteLine(e.Message);
    }

    IntPtr buffer = Marshal.AllocCoTaskMem(iStructSize*10);
    Marshal.Copy(ed.inner,0,buffer,iStructSize*10);

    int iCurOffset = 0;

    for(int i = 0; i < 10; i++)
    {
        inn[i] = (INNER)Marshal.PtrToStructure(new IntPtr(buffer.ToInt32() + iCurOffset),typeof(INNER) );
        iCurOffset += iStructSize;
    }

    Console.WriteLine(ed.field1);
    Marshal.FreeCoTaskMem(buffer);
}
于 2013-04-11T16:39:52.177 回答
0

我能够根据我的应用程序中的现有代码找出它(非常感谢 Romoku 的提及Marshal

我完成的代码如下所示:

int handle = 920663024; // integer pointer corresponding to memory location 0x36E033F0
IntPtr app_handle = helper.GetAppPtr(handle) // gets IntPtr based off of handle
object obj = Marshal.GetObjectForIUnknown(app_handle);
MyAppClass newApp = obj as MyAppClass;

奇迹般有效!

于 2013-04-12T17:26:18.847 回答