先看一下代码
[DllImport("GDI32.dll")]
private static extern IntPtr CreatePolygonRgn(Point[] ptArr, int nCount, int nPolyFillMode);
这个API的函数原型是这样的int SetWindowRgn(
HWND hWnd, // handle to window
HRGN hRgn, // handle to region
BOOL bRedraw // window redraw option
);
其中的参数类型的匹配有什么规则吗?为什么IntPtr可以代替HRGN?难道说只要sizeof()相同就可以吗?
不好意思,代码确实搞错了,因为用到了几个函数,有点搞混了。。
[DllImport("User32.dll")]
private static extern IntPtr SetWindowRgn(IntPtr hWnd, IntPtr hRgn, bool bReDraw);
也就是说,理论上,机器存储句柄值其实就是4个字节,而IntPtr也是4个字节,所以即使转换也是没有损失的,这样理解可以吗?
关于C#中调用导入函数的参数类型区配问题
答案:2 悬赏:20 手机版
解决时间 2021-03-15 14:40
- 提问者网友:眉目添风霜
- 2021-03-15 06:55
最佳答案
- 五星知识达人网友:玩家
- 2021-03-15 08:33
代码抄错了吧?
所有windows的句柄类型,都应该用 IntPtr 来代替。
当然,所有的句柄类型都只是一个数字,在32位系统下面,就是一个32位的数字。 所以,实际上,你用一个 Int32 来代替,也是可以的。
在决定应该用.net下的什么类型来替代相应的C数据类型时,最好先看一下该类型的原始类型定义,再来决定用什么.net类型来代替。
比如,我们来看看HRGN 的定义:
我们看到 WinDef.h 有如下定义:
DECLARE_HANDLE(HRGN);
这里调用了DECLARE_HANDLE这个宏,
在WinHT.h中有如下定义:
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
这个宏是什么意思?
好吧,对于
DECLARE_HANDLE(HRGN);来说,这句话就相当于
struct HRGN__ { int unused; }; typedef struct HRGN__ *HRGN;
这下清楚了,原来 HRGN 就是 HRGN__ *
指针嘛,就是一个内存地址,而.net下,用来描述指定的,自然是 IntPtr 对象了。
而且在32位系统下,指针自然是32位的,在64位系统下,指针就成了64位的,而IntPtr正好也可以有这种平台适应,所以是最好的选择了。
//-----------------------------------------------------------
原则上,是可以这么理解,就这个HRGN来说,它是一个C指针。
因为我现在使用的是32位的系统,所以指针是32位的,也就是占4字节。
但是指针的长度是跟平台相关的,64位的系统,指针自然也就是8字节。
而IntPtr这个类型正好也是平台自适应的,在32位下,它占4字节,在64位下,它也占8字节。
所有windows的句柄类型,都应该用 IntPtr 来代替。
当然,所有的句柄类型都只是一个数字,在32位系统下面,就是一个32位的数字。 所以,实际上,你用一个 Int32 来代替,也是可以的。
在决定应该用.net下的什么类型来替代相应的C数据类型时,最好先看一下该类型的原始类型定义,再来决定用什么.net类型来代替。
比如,我们来看看HRGN 的定义:
我们看到 WinDef.h 有如下定义:
DECLARE_HANDLE(HRGN);
这里调用了DECLARE_HANDLE这个宏,
在WinHT.h中有如下定义:
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
这个宏是什么意思?
好吧,对于
DECLARE_HANDLE(HRGN);来说,这句话就相当于
struct HRGN__ { int unused; }; typedef struct HRGN__ *HRGN;
这下清楚了,原来 HRGN 就是 HRGN__ *
指针嘛,就是一个内存地址,而.net下,用来描述指定的,自然是 IntPtr 对象了。
而且在32位系统下,指针自然是32位的,在64位系统下,指针就成了64位的,而IntPtr正好也可以有这种平台适应,所以是最好的选择了。
//-----------------------------------------------------------
原则上,是可以这么理解,就这个HRGN来说,它是一个C指针。
因为我现在使用的是32位的系统,所以指针是32位的,也就是占4字节。
但是指针的长度是跟平台相关的,64位的系统,指针自然也就是8字节。
而IntPtr这个类型正好也是平台自适应的,在32位下,它占4字节,在64位下,它也占8字节。
全部回答
- 1楼网友:佘樂
- 2021-03-15 10:05
private decimal calctotal(params decimal[] moneys)
{
decimal total = 0;
foreach (decimal money in moneys)
{
if (money != null && money != 0)
{
total += money;
}
}
return total;
}
这个方法中你可以输入任意个数的decimal,也可以直接传decimal数组进去.
注意,参数一定要做非null判断
-----
告诉你了,是params 关键字
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯