【问题标题】:Equivalent data types of C++ in C#C#中C++的等价数据类型
【发布时间】:2011-03-01 18:47:45
【问题描述】:

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

  • 我对 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

【问题讨论】:

    标签: c# mfc casting types pinvoke


    【解决方案1】:

    是的,您可以调用这些功能的可能性很大。它们看起来像常规的 C 函数,而不是 C++ 类的实例方法。 ULONG 在 C# 中是 uint,double 是普通的 double。 * 表示传递了指向该值的指针。虽然它是模棱两可的,它可以是通过引用传递的参数(C# 中的 ref 或 out 关键字),也可以是数组。

    第一个函数在 C# 中肯定将其第一个参数作为“out uint”传递,它返回一个句柄值。

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

    【讨论】:

    • 谢谢。这对我很有帮助。我已经更新了我的问题。你能看一下论点并为我阐明一些观点吗?另外:这是第一个功能的正确实现吗? public static extern UInt32 PCXUS_Open(ref UInt32 hPCXUS, int boot);
    • 我的回答还是准确的。用完。
    【解决方案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[]

    【讨论】:

    • 谢谢。我应该如何定义 MAX_ROW?它是 Dll 中的预定义常量吗?
    • 也许有人可以纠正我,但我不相信有办法像那样从 DLL 中提取常量。将返回类型声明为 double[] 是安全的,然后重新声明常量(可能不是最好的)或创建一个函数,在实际迭代时在运行时输出 MAX_ROW 值。
    • 猜猜我会使用依赖 walker 并在我的 c# 包装器中重新定义它。
    猜你喜欢
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    相关资源
    最近更新 更多