PInvoke and POINT
PInvoke and POINT
我的非托管C++DLL有一个带有POINT out参数的函数:
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作为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数组是非常原始的,没有烘焙长度属性。
因此,正确的声明无疑是:
[DllImport(@"unmanaged.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern void GetPosition(int iItemIndex, out Point pt);
请注意,我添加了CallingConvention属性,它是C代码的默认属性。如果您确信它使用__stdcall,请将其删除。
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 位阵列上的快速AND运算
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- BoostPython and CMake
- OpenSSL BIO and SSL_read
- Gurobi GRBModel and GRBmodel in C++
- std::visit and std::variant usage
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- Directx12 and keystrokes
- different between int **arr =new int [ n]; and int a[i][j]?
- C++ getenv and setenv
- Inference pytorch C++ with alexnet and cv::imread image
- Visual Studio 2019 C++ and std::filesystem
- 保证逻辑 AND 表达式中的函数调用
- python ctypes and C++ pointers
- C++ const char with .begin() and .end()
- CreatePolygonRgn and const POINT *
- PInvoke and POINT