C# 如何P/调用double* 我试图从C++中调用C++方法。不幸的是,C++库的文档很不完善,但是我可以访问定义方法的头文件,所以.

C# 如何P/调用double* 我试图从C++中调用C++方法。不幸的是,C++库的文档很不完善,但是我可以访问定义方法的头文件,所以.,c#,c++,pointers,pinvoke,C#,C++,Pointers,Pinvoke,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 = "In

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数组的结果,但我不确定这是否适用于我的场景

所以我的问题是,我做得对吗


(请注意,这与Norav 1200M ECG设备有关,因此如果有人使用过该设备并能告诉我我做错了什么,那也太好了)

此外,您需要确定
double*
是表示数组还是简单的“out”参数。从C++实例中,它似乎表示一个“OUT”参数。@ ReMyLeBeAu:<代码> Pascal 在Win32上映射到<代码>它过去是一种不同的调用约定,但这是Win16的遗留问题。(与
FAR
一样)
marshallas(UnmanagedType.R8)
应该被删除。该参数是指向双精度的指针,而不是实际的双精度。我不知道当这个属性被误用时,封送员会对它做什么,所以这可能没有什么区别,但它肯定也没有什么好处
ref double
out double
应该正确封送,而不需要进一步的属性。返回值也是如此
Uint32
已作为4字节整数封送,没有理由使用
MarshalAs(UnmanagedType.U4)
显式封送它。不要使用
marshallas
,除非您确实需要它来指定不同于默认行为的封送行为。@Jeroenmoster您是对的,我正在查看
PASCAL
\u MAC
定义,该定义为空。当未定义
\u MAC
时,如果编译器支持
\u stdcall
,则
PASCAL
PASCAL
都映射到
\u stdcall
,否则为空。
double[] pmvIn1Num = new double[] { 0 };
resultCode = Init(6, 1, 250, pmvIn1Num, 1);