永发信息网

关于C#中调用导入函数的参数类型区配问题

答案:2  悬赏:20  手机版
解决时间 2021-03-15 14:40
先看一下代码
[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个字节,所以即使转换也是没有损失的,这样理解可以吗?
最佳答案
代码抄错了吧?

所有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字节。
全部回答
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 关键字
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
江铃顺利达车架号在哪里
永兴酒馆我想知道这个在什么地方
梦到蛇挂在自已门在如何?
学服装设计不出国留学好就业么
粘合机上的振动电机坏了,在哪买的质量好啊,
为什么都是我主动发信息给他,他有时候就有回
东光三中附近便宜租用的平房
娃哈哈平定锦程店我想知道这个在什么地方
怎么把电脑系统拷贝到U盘里
c语言中u=%61d n=%91d什么意思
芦草沟村这个地址在什么地方,我要处理点事
周星驰演过的最搞笑电影有哪几部?
明代十库是干什么的 分别叫什么名字
新疆财经大学继续教育学院怎么样
兴皖路/皋城东路(路口)我想知道这个在什么地
推荐资讯
为什么当年淳安县里有很多村的人集体搬迁至江
属相与纹身 属鸡的人纹什么纹身最好
铁观音喝多了口干是怎么回事
农历1980年1月27日卯时生人是什么星座
圣剑使的禁咒咏唱漫画更新到第几话?哪能看?
1,蕨菜怎么做最好吃
在哪儿可以买到啊 泰国哪个牌子的乳胶枕头好
甜梦床垫我想知道这个在什么地方
我看见我婆婆我想弄死她
普陀山图崴小吃城这个地址在什么地方,我要处
黑古渠稍怎么去啊,有知道地址的么
蒂赛尔定制蛋糕(联盟食之良品配送点)地址在什
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?