首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PInvoke与点

PInvoke与点
EN

Stack Overflow用户
提问于 2014-01-04 11:36:55
回答 1查看 411关注 0票数 0

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

代码语言:javascript
复制
void GetPosition(int iItemIndex, POINT *pt)

我试图在我的PInvoke应用程序中使用C#函数:

代码语言:javascript
复制
[DllImport(@"unmanaged.dll")]
public static extern void GetPosition(int iItemIndex, System.Drawing.Point pt);

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

代码语言:javascript
复制
void GetPosition(int iItemIndex, long *x, long *y)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-04 12:19:13

POINT是一个C结构,它的pinvoke等价于一个具有两个int类型成员的C#结构。System.Drawing.Point已经是一个非常好的候选人,不需要自己写。

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

代码语言:javascript
复制
  public static extern void GetPosition(int iItemIndex, out Point pt);
  public static extern void GetPosition(int iItemIndex, Point[] points);

数组版本是非常不可能的,您可以期望C程序员使用复数的GetPositions()。还有一个问题,就是它不知道数组有多大,C数组非常原始,没有烘焙长度属性。

因此,正确的声明肯定是:

代码语言:javascript
复制
  [DllImport(@"unmanaged.dll", CallingConvention=CallingConvention.Cdecl)]
  public static extern void GetPosition(int iItemIndex, out Point pt);

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20920467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档