c# - 如何从 C# P/Invoke 中的 void 指针指针获取结果
问题描述
我正在尝试围绕 Windows 烛光库编写 C# 包装器,但我被困在这个函数上:
typedef void* candle_list_handle;
DLL bool __stdcall candle_list_scan(candle_list_handle *list);
这是我尝试过的:
[DllImport("candle_api.dll", CallingConvention = CallingConvention.StdCall)]
public static extern bool candle_list_scan(ref IntPtr listPtr);
public candle_list_t? Scan()
{
IntPtr ptr = new IntPtr();
var res = candle_list_scan(ref ptr);
var list = Marshal.PtrToStructure<candle_list_t>(ptr);
if (res)
{
return list;
}
else
return null;
}
我也试过:
[DllImport("candle_api.dll", CallingConvention = CallingConvention.StdCall)]
public static extern bool candle_list_scan(ref IntPtr listPtr);
public candle_list_t? Scan()
{
IntPtr ptr = new IntPtr();
var res = candle_list_scan(ref ptr);
var list = Marshal.PtrToStructure<candle_list_t>(ptr);
if (res)
{
return list;
}
else
return null;
}
但两者都没有正常工作。这是设置列表的 C 代码:
bool __stdcall candle_list_scan(candle_list_handle *list)
{
if (list==NULL) {
return false;
}
candle_list_t *l = (candle_list_t *)calloc(1, sizeof(candle_list_t));
*list = l;
if (l==NULL) {
return false;
}
....
和烛台_t 是:
typedef struct {
uint8_t num_devices;
candle_err_t last_error;
candle_device_t dev[CANDLE_MAX_DEVICES];
} candle_list_t;
我转换成
public struct candle_list_t
{
public byte num_devices;
public candle_err_t last_error;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public candle_device_t[] dev;
}
使用我的第一种方法, num_devices 值有一个值,但它是无效的,因为它超出了 C 库中代码的 num_devices 的限制。使用第二种方法,我只得到一个空结构。
解决方案
推荐阅读
- php - 以这种格式显示来自 sql 数据库的日期:2019 年 5 月 10 日,星期五
- bootstrap-modal - 在移动设备上打开模式的引导问题
- unit-testing - 在 go 中模拟用于测试的内部函数
- javascript - 在类型类 Symfony 中使用 Javascript
- vba - 如何修复:权限被拒绝、运行时错误 70、FSO 文件脚本、计算机问题
- c++ - 来自模板参数的派生类没有受保护的成员访问
- python - 如何使用 panda 在 python 中加载具有文件夹名称和图像名称但不包含 id 的数据集文件?
- php - 如何让我的代码写入数据库
- jquery - 如何获取标题标题并将其显示在另一个 div 或 span 中?
- node.js - 将 node.js 中查询函数的输出变量返回到该函数的外部