如何P /调用双倍*

时间:2018-08-20 16:57:42

标签: c# c++ pointers pinvoke

我正在尝试从C#调用C ++方法。不幸的是,C ++库的文档非常简短,但是我可以访问定义方法的头文件。

C ++声明为:

DWORD FAR PASCAL EXPORT Init(int numOfChannels,int startLead,int smpRate,double* pMV_in_1_NUM,int mode  = 0);

不幸的是,文档仅提供了使用此方法的C ++示例,即:

Init (8, 1, 500, &pMV_in_1_NUM, 1); 

但是我试图从C#调用它,所以我的代码是:

[DllImport("NVECGUSB.dll", EntryPoint = "Init")]
[return: MarshalAs(UnmanagedType.U4)]
private static extern UInt32 Init(
    int numOfChannels,
    int startLead,
    int smpRate,
    [param: MarshalAs(UnmanagedType.R8)]
    ref double pMV_in_1_NUM,
    int mode
    );

然后...

double pmvIn1Num = 0;
resultCode = Init(8, 1, 500, ref pmvIn1Num, 1);
Console.WriteLine("Init returned {0}", resultCode.ToString("x"));

它不会崩溃或发生任何事情,但是resultCode表示参数不正确,即使根据文档它们的值正确,所以我猜我的方式有问题传递该double *参数。 (我愿意接受我在那儿错了,但现在我无法想到发生该错误的另一个原因)

请注意,我也尝试过

[DllImport("NVECGUSB.dll", EntryPoint = "Init")]
[return: MarshalAs(UnmanagedType.U4)]
private static extern UInt32 Init(
    int numOfChannels,
    int startLead,
    int smpRate,
    double[] pMV_in_1_NUM,
    int mode
    );

double[] pmvIn1Num = new double[] { 0 };
resultCode = Init(6, 1, 250, pmvIn1Num, 1);

因为Google搜索会抛出有关double数组的结果,但是我不确定这是否适用于我的情况。

所以我的问题是,我做得正确吗?

(请注意,这与Norav 1200M ECG设备有关,因此,如果有人使用该设备工作并且可以告诉我我做错了,那也很好)

0 个答案:

没有答案