我应该如何将空指针传递给 C++ 函数,就像 C# 中的 IntPter.Zero 一样?
How shoud I pass a null pointer to c++ function just like IntPter.Zero in C#?
我尝试使用 fii 的 C++ dll,其中一个函数声明如下:
QCAP_CREATE( CHAR * pszDevName /*IN*/, UINT iDevNum /*IN*/, HWND hAttachedWindow /*IN*/, PVOID * ppDevice /*OUT*/, BOOL bThumbDraw = FALSE /*IN*/, BOOL bMaintainAspectRatio = FALSE /*IN*/ );
我试图通过 ref 将空指针传递给第三个参数 "hAttachedWindow ",如下所示:
const ffi = require('ffi');
const ref = require('ref');
const path = require('path');
let dllPath = path.join(__dirname, '/QCAP.X64');
let intPtr = ref.refType('int');
let QCAP = ffi.Library(dllPath, {
'QCAP_CREATE': [ref.types.ulong, [ref.types.CString, ref.types.uint,
intPtr, intPtr, ref.types.bool, ref.types.bool]]
});
let ppdevice = ref.alloc('int');
let initResult = QCAP.QCAP_CREATE('CY3014 USB', 0, ref.NULL, ppdevice, true, false);
但是函数一直抛出错误说第三个参数有效,我已经像这样成功地在 C# 中导入了这个函数,
[DllImport(@"D:workcode\video\code\VideoDemo\CPlusPlus\obj\Debug\QCAP.X64.DLL", EntryPoint = "QCAP_CREATE")]
public static extern ulong QCAP_CREATE(string deviceName, UInt32 iDevNum, IntPtr hAttachedWindow, out IntPtr ppDevice, bool bThumbDraw, bool bMaintainAspectRatio);
static void Main(string[] args)
{
try
{
public IntPtr ppDevice = new IntPtr(0x00000000);
var result = QCAP_CREATE("CY3014 USB", 0, IntPtr.Zero, out ppDevice, true, false);
}
我查看了 ref 的源代码,它说 ref.NULL 是
/** 引用 C NULL 指针的缓冲区。 */
所以我认为 ref.NULL 在 C# 中等于 IntPtr.Zero,但它提供了我错误的信息。
我已经在谷歌上搜索了很长时间,但没有任何帮助,有人可以给我一些建议吗?非常感谢!
您的部分困惑是 C# 类型 IntPtr
不代表 "pointer to int",而是 "pointer interpreted as int"。
另一部分是,将别名剥离到所涉及的类型后,第三和第四个参数是不同的指针类型,void *
和void **
。 C# 绑定隐藏了这一点,因为 out
限定符传递了您分配的 IntPtr
的 地址 ,允许库函数对其进行修改。
试试这个
const ffi = require('ffi');
const ref = require('ref');
const path = require('path');
let dllPath = path.join(__dirname, '/QCAP.X64');
let voidPtr = ref.refType(ref.types.void);
let voidPtrPtr = ref.refType(voidPtr);
let QCAP = ffi.Library(dllPath, {
'QCAP_CREATE': [ref.types.ulong, [ref.types.CString, ref.types.uint,
voidPtr, voidPtrPtr, ref.types.bool, ref.types.bool]]
});
let ppdevice = ref.alloc(voidPtrPtr);
let initResult = QCAP.QCAP_CREATE('CY3014 USB', 0, ref.NULL, ppdevice, true, false);
let pdevice = ppdevice.deref();
我尝试使用 fii 的 C++ dll,其中一个函数声明如下:
QCAP_CREATE( CHAR * pszDevName /*IN*/, UINT iDevNum /*IN*/, HWND hAttachedWindow /*IN*/, PVOID * ppDevice /*OUT*/, BOOL bThumbDraw = FALSE /*IN*/, BOOL bMaintainAspectRatio = FALSE /*IN*/ );
我试图通过 ref 将空指针传递给第三个参数 "hAttachedWindow ",如下所示:
const ffi = require('ffi');
const ref = require('ref');
const path = require('path');
let dllPath = path.join(__dirname, '/QCAP.X64');
let intPtr = ref.refType('int');
let QCAP = ffi.Library(dllPath, {
'QCAP_CREATE': [ref.types.ulong, [ref.types.CString, ref.types.uint,
intPtr, intPtr, ref.types.bool, ref.types.bool]]
});
let ppdevice = ref.alloc('int');
let initResult = QCAP.QCAP_CREATE('CY3014 USB', 0, ref.NULL, ppdevice, true, false);
但是函数一直抛出错误说第三个参数有效,我已经像这样成功地在 C# 中导入了这个函数,
[DllImport(@"D:workcode\video\code\VideoDemo\CPlusPlus\obj\Debug\QCAP.X64.DLL", EntryPoint = "QCAP_CREATE")]
public static extern ulong QCAP_CREATE(string deviceName, UInt32 iDevNum, IntPtr hAttachedWindow, out IntPtr ppDevice, bool bThumbDraw, bool bMaintainAspectRatio);
static void Main(string[] args)
{
try
{
public IntPtr ppDevice = new IntPtr(0x00000000);
var result = QCAP_CREATE("CY3014 USB", 0, IntPtr.Zero, out ppDevice, true, false);
}
我查看了 ref 的源代码,它说 ref.NULL 是
/** 引用 C NULL 指针的缓冲区。 */
所以我认为 ref.NULL 在 C# 中等于 IntPtr.Zero,但它提供了我错误的信息。 我已经在谷歌上搜索了很长时间,但没有任何帮助,有人可以给我一些建议吗?非常感谢!
您的部分困惑是 C# 类型 IntPtr
不代表 "pointer to int",而是 "pointer interpreted as int"。
另一部分是,将别名剥离到所涉及的类型后,第三和第四个参数是不同的指针类型,void *
和void **
。 C# 绑定隐藏了这一点,因为 out
限定符传递了您分配的 IntPtr
的 地址 ,允许库函数对其进行修改。
试试这个
const ffi = require('ffi');
const ref = require('ref');
const path = require('path');
let dllPath = path.join(__dirname, '/QCAP.X64');
let voidPtr = ref.refType(ref.types.void);
let voidPtrPtr = ref.refType(voidPtr);
let QCAP = ffi.Library(dllPath, {
'QCAP_CREATE': [ref.types.ulong, [ref.types.CString, ref.types.uint,
voidPtr, voidPtrPtr, ref.types.bool, ref.types.bool]]
});
let ppdevice = ref.alloc(voidPtrPtr);
let initResult = QCAP.QCAP_CREATE('CY3014 USB', 0, ref.NULL, ppdevice, true, false);
let pdevice = ppdevice.deref();