gpt4 book ai didi

c# - PInvoke 和 POINT

转载 作者:行者123 更新时间:2023-11-28 03:00:44 27 4
gpt4 key购买 nike

我的非托管 C++ DLL 有一个带有 POINT out 参数的函数:

void GetPosition(int iItemIndex, POINT *pt)

我正在尝试在我的 C# 应用程序中调用 PInvoke 函数:

[DllImport(@"unmanaged.dll")]
public static extern void GetPosition(int iItemIndex, System.Drawing.Point pt);

我的问题是,我应该使用 System.Drawing.Point 作为 POINT 的 C# 等价物吗?修改非托管代码是一种选择。我应该改用两个 long 吗?

void GetPosition(int iItemIndex, long *x, long *y)

最佳答案

POINT 是一个 C 结构,它的 pinvoke 等效项是一个具有两个 int 类型成员的 C# 结构。 System.Drawing.Point 已经是一个非常好的候选者,无需自己编写。

但是请注意,您的 C# 声明不正确。 C 声明使用 POINT*,指向 POINT 结构的指针。 C 声明通常模棱两可。这可能意味着 POINT 通过引用传递,以便函数填充成员。或者可能意味着调用者应该传递 POINT 结构的数组。因此,这两个 C# 声明中的任何一个都可以匹配:

  public static extern void GetPosition(int iItemIndex, out Point pt);
public static extern void GetPosition(int iItemIndex, Point[] points);

数组版本不太可能,您希望 C 程序员使用复数形式的 GetPositions()。并且有一个问题是它不知道数组有多大,C 数组非常原始并且没有内置的 Length 属性。

所以正确的声明肯定是:

  [DllImport(@"unmanaged.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern void GetPosition(int iItemIndex, out Point pt);

请注意,我添加了 CallingConvention 属性,这是 C 代码的默认设置。如果您确定它使用 __stdcall,请将其删除。

关于c# - PInvoke 和 POINT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20920467/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com