我的非托管C++ DLL有一个带有点出参数的函数:
void GetPosition(int iItemIndex, POINT *pt)我试图在我的PInvoke应用程序中使用C#函数:
[DllImport(@"unmanaged.dll")]
public static extern void GetPosition(int iItemIndex, System.Drawing.Point pt);我的问题是,我应该使用System.Drawing.Point作为C#等价的点吗?修改非托管代码是一个选项。我应该用两个long来代替吗?
void GetPosition(int iItemIndex, long *x, long *y)发布于 2014-01-04 12:19:13
POINT是一个C结构,它的pinvoke等价于一个具有两个int类型成员的C#结构。System.Drawing.Point已经是一个非常好的候选人,不需要自己写。
但是,请注意您的C#声明是不正确的。C声明使用点*,指向点结构的指针。C声明往往含糊不清。这意味着通过引用传递点,以便函数填充成员。或者可能意味着调用方应该传递一个点结构数组。因此,这两个C#声明中的任何一个都是匹配的:
public static extern void GetPosition(int iItemIndex, out Point pt);
public static extern void GetPosition(int iItemIndex, Point[] points);数组版本是非常不可能的,您可以期望C程序员使用复数的GetPositions()。还有一个问题,就是它不知道数组有多大,C数组非常原始,没有烘焙长度属性。
因此,正确的声明肯定是:
[DllImport(@"unmanaged.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern void GetPosition(int iItemIndex, out Point pt);请注意,我添加了CallingConvention属性,它是C代码的默认设置。如果您确信它使用__stdcall,请删除它。
https://stackoverflow.com/questions/20920467
复制相似问题