You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用ctypes从DLL中获取const float数组?

获取DLL中float数组的方法(无需新增导出函数)

当然有办法!既然你已经能从DLL里读取单个int值,那读取float数组的思路其实是相通的——核心都是直接定位到DLL内存空间里的数组地址,然后按已知的大小去读取数据。下面分几种常见场景给你具体方案:

  • 原生C/C++场景
    如果你是在原生代码里操作,先确认这个float数组是DLL的导出变量(或者你已经通过逆向工具拿到了它的内存偏移量)。假设你之前读取单个int的代码是这样的:

    // 读取单个导出int值的示例
    HMODULE hDll = LoadLibraryA("YourDll.dll");
    int* pTargetInt = (int*)GetProcAddress(hDll, "ExportedTargetInt");
    int intValue = *pTargetInt;
    

    那读取float数组只需把指针类型改成float数组,再按已知大小批量读取:

    HMODULE hDll = LoadLibraryA("YourDll.dll");
    // 假设数组的导出名为"ExportedFloatArray"
    float* pFloatArray = (float*)GetProcAddress(hDll, "ExportedFloatArray");
    const int arraySize = 10; // 你已知的数组长度
    float localArray[10];
    // 批量复制数组内容到本地
    for (int i = 0; i < arraySize; ++i) {
        localArray[i] = pFloatArray[i];
    }
    

    如果数组没有被导出,你需要先通过IDA、PEview这类工具拿到它在DLL中的相对偏移量,再计算实际地址:

    HMODULE hDll = LoadLibraryA("YourDll.dll");
    // 假设逆向得到的偏移量是0x12345
    float* pFloatArray = (float*)((uintptr_t)hDll + 0x12345);
    // 后续读取逻辑和上面一致
    
  • 托管语言(以C#为例)场景
    要是你用的是C#这类托管语言,之前读int可能用到了DllImport或Marshal类,那读取float数组可以用Marshal.Copy批量复制内存:

    [DllImport("kernel32.dll")]
    private static extern IntPtr LoadLibrary(string dllPath);
    
    [DllImport("kernel32.dll")]
    private static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
    
    // 封装的读取方法
    public static float[] ReadFloatArrayFromDll(string dllPath, string arrayExportName, int arraySize)
    {
        IntPtr dllHandle = LoadLibrary(dllPath);
        IntPtr arrayPtr = GetProcAddress(dllHandle, arrayExportName);
        float[] resultArray = new float[arraySize];
        // 把DLL内存里的数组批量复制到托管数组
        Marshal.Copy(arrayPtr, resultArray, 0, arraySize);
        return resultArray;
    }
    

    同样,如果数组未导出,只需计算偏移后再调用Marshal.Copy:

    IntPtr arrayPtr = IntPtr.Add(dllHandle, 0x12345); // 替换为实际偏移量
    // 后续复制逻辑同上
    
  • 关键注意事项

    • 必须确保DLL已经通过LoadLibrary加载到当前进程空间,否则内存地址无效
    • 要保持程序和DLL的位数一致(32位程序读32位DLL,64位同理),否则会出现地址不匹配的崩溃问题
    • 直接访问未导出的变量依赖于DLL的内存布局,一旦DLL更新(比如编译选项修改、代码迭代),偏移量很可能失效,这种方式风险较高,需要谨慎使用

内容的提问来源于stack exchange,提问作者user2133814

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:41:46