如何使用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更新(比如编译选项修改、代码迭代),偏移量很可能失效,这种方式风险较高,需要谨慎使用
- 必须确保DLL已经通过
内容的提问来源于stack exchange,提问作者user2133814
相关产品推荐
相关产品推荐

