2011-03-01 117 views
1

我想在我的C#应用​​程序中使用MFC Dll。它基本上是一个更容易与硬件设备连接的代理。 我正在使用P/Invoke编写一个包装类,以便能够使用dll中定义的方法。C++中等效数据类型的C#

  • 我是相当新的P/Invoke的东西。它会继续工作吗?我无法经常测试它,因为我没有可用的硬件在我的开发机器上进行测试。
  • 请问我可以引用一个C#中具有等效数据类型的C++页吗?当变量旁边有一个*时,我应该使用什么类型?像 double *ULONG *int *

ULONG WINAPI PCXUS_Open(ULONG *hPCXUS, int boot) 
ULONG WINAPI PCXUS_WRITE(ULONG hPCXUS, int Board, int Test, int Unit, 
LPCSTR strParam, double *dblValue, double dblArrayValue1[MAX_ROW], 
double dblArrayValue2[MAX_ROW], LPSTR StrValue, int *Clipped) 

最后,我应该如何界定,在他们的定义括号变量?像:
double dblArrayValue1[MAX_ROW]double dblArrayValue1[MAX_ROW]

更新:这是第二个方法的定义:

Arguments: 
hPCXUS   //Your access number (see PCXUS_Open function) 
Board   //Board number (0 to N) 
Test   //Test number (0 to 7) (only for USPC with MUX extension) 
Unit   //0 = µs ; 1 = mm ; 2 = inch 
StrParam  //Pointer to parameter name (see the list) 
DblValue  //Pointer to parameter value 
DblArrayValue1 //Parameter data array 1 
DblArrayValue2 //Parameter data array 2 
StrValue  //ASCII parameter value 
Clipped  //Pointer to clip information 

回答

2

是的,你可以调整这些功能的赔率是体面的。它们看起来像普通的C函数,而不是C++类的实例方法。 ULONG在C#中是uint,double是普通的double。 *表示指向该值的指针被传递。这是不明确的,它可以是通过引用(C#中的ref或out关键字)传递的参数,也可以是数组。

第一个函数在C#中将第一个参数明确地传递为“out uint”,它返回一个句柄值。

第二个功能更难。有没有像样的猜测dblValue是一个数组还是通过引用传递,它的名字是糟糕的。在“ref double”处开始猜测,您必须查看C++代码才能确定。与strParam同样的问题,如果它的值被传入,它应该是“字符串”,如果返回一个值,它应该是StringBuilder。 dblArrayValue参数绝对是C#中double []的数组。

+0

谢谢。这帮助我很多。我更新了我的问题。你能否看看一些观点并为我提供一些启示? Plus:这是第一个函数的正确实现吗? '公共静态外部UInt32 PCXUS_Open(参考UInt32 hPCXUS,诠释引导);' – Kamyar 2011-03-01 19:06:27

+0

我的答案仍然是准确的。用完了。 – 2011-03-01 19:14:03

+0

非常感谢Hans。 – Kamyar 2011-03-01 19:15:20

2

是的,这应该工作。

对于C#的数据类型: http://msdn.microsoft.com/en-us/library/s1ax56ch(v=VS.100).aspx

对于C#指针: http://msdn.microsoft.com/en-us/library/y31yhkeb(v=VS.100).aspx

双打的阵列是在C#double[]

+0

谢谢。我应该如何定义MAX_ROW?它是在Dll中预定义的常量吗? – Kamyar 2011-03-01 18:53:31

+0

有人可能能够纠正我,但我不相信有一种方法可以像这样从DLL中取出常量。将返回类型声明为'double []'是安全的,然后重新声明常量(可能不是优选的),或者创建一个函数,在实际迭代时在运行时输出MAX_ROW值。 – 2011-03-01 19:00:04

+0

猜测我会用依赖walker去,只是在我的c#包装中重新定义它。 – Kamyar 2011-03-01 19:07:49