c# - 如何在 C# 中 P/Invoke 具有未知结构的函数?
问题描述
我知道这听起来很奇怪,但我什至不知道如何正确地问这个问题。我一直在尝试 P/Invoke 到 NVidia 的 NVML 库中,但成功有限:我设法调用了该库导出的一些 API
现在我正在尝试打电话nvmlDeviceGetHandleByIndex_v2
,但我已经被困在这个电话上很长时间了。它接受一个nvmlDevice_t
指针,但我没有发现任何nvmlDevice_t
超出此标头定义的内容:
typedef struct nvmlDevice_st* nvmlDevice_t;
问题是头文件没有进行任何其他引用,nvmlDevice_st
所以我不知道要为其分配多少堆空间(如果有的话)。我发现这个官方的 C++ 示例调用相同的函数,如下所示:
nvmlDevice_t device;
CheckNVMLErrors(nvmlDeviceGetHandleByIndex(device_index, &device));
我的主要问题是我对 C/C++ 不够熟悉,无法理解device
声明完成的隐式机制/内存分配,并且nvml.h
标题没有定义nvmlDevice_st
实际是什么。
我尝试使用ref int
参数(带有初始0
值)调用它,显然它确实有效,但我想了解原因,如果可能的话。作为参考,ref int
调用后该参数的值是1460391512
,以防可以从中发现一些东西。
解决方案
如果您查看源代码,那只是 SDK 使用的内部指针。它指向的值对你没有意义。您可以使用它来识别您正在使用的设备。
想想Handle
还是HWND
在 Windows 中。你调用类似的东西FindWindow()
,它会返回一个似乎是随机值的东西给你。您不关心该值是什么,您只需在调用GetWindowText()
或任何其他窗口方法时使用该值来识别该窗口。
因此,您使用 using 走在正确的轨道上ref int
,但您想要的是一个指针。所以你应该使用out IntPtr
来获取价值。
推荐阅读
- python - 列表索引超出范围... :(
- ios - 在 Xcode 中打印输出时出错(swift)
- php - 将php数组元素插入mysql数据库
- javascript - 在接口中用冒号声明字段
- machine-learning - 是什么导致 GAN 生成的图像看起来与训练集中提供的图像不同
- python - 括号内的Python3打印变量
- javascript - 如何修复猫鼬中的“.create不是函数”错误
- cmake - 为什么我的 rapidjson/example/serialize/serialize.cpp 的简化版本会引发分段错误?
- java - java集合中嵌套数据结构的复合键
- javascript - 如何在 ajax 标头中为每个用户发送 api 令牌?