C#中的IntPtr类型(指针等用)
c#中无法将类型“int”隐式转换为“System.IntPtr”
所以,在您调用的API函数中一定有类似窗体句柄这样的参数,那么当您声明这个函数时,您应该将它显式地声明为IntPtr类型。
例如,在一个C#程序中调用Win32API mciSendString函数控制光盘驱动器,这个函数的函数原型是:
MCIERROR mciSendString(
LPCTSTR lpszCommand,
LPTSTR lpszReturnString,
UINT cchReturn,
HANDLE hwndCallback
);
首先在C#中声明这个函数:
[DllImport("winmm.dll")]
private static extern long mciSendString(string a,string b,uint c,IntPtr d);
然后用这样的方法调用:
mciSendString("set cdaudio door open", null, 0, this.Handle);
您也可以使用IntPtr.Zero将句柄设置为0;
或者使用类型强制转换:
mciSendString("set cdaudio door open", null, 0, (IntPtr)0 );
或者,使用IntPtr构造函数:
IntPtr a = new IntPtr(2121);
这里有两点比较重要:
一是在C#中声明Win32API时,一定要按照WinAPI的原型来声明,不要改变它的数据类型;
二是尽量不要过多使用类型强制转换或构造函数的方式初始化一个IntPtr类型的变量,这样会使程序变得难于理解并容易出错。
希望这些信息对您有帮助。
- 近来研究指针,在C#中谈指针,就不得不谈IntPtr,以下是我对IntPtr的初步了解,一些基础。
一:什么是IntPtr
先来看看MSDN上说的:用于表示指针或句柄的平台特定类型。这个其实说出了这样两个事实,IntPtr 可以用来表示指针或句柄、它是一个平台特定类型。对于它的解释,这个哥们写的比较好:It's a class that wraps a pointer that is used when calling Windows API functions. The underlying pointer may be 32 bit or 64 bit, depending on the platform.
二:用在什么地方
(1)C#调用WIN32 API时
(2)C#调用C/C++写的DLL时(其实和1相同,只是这个一般是我们在和他人合作开发时经常用到)
三:怎样用
例如有一函数原型定义为:DLLDemo_API int __stdcall Inptr_Test (LONG param1, HWND hWnd);那么我们在C#中引用时就要这样写:
[DllImport("DllPlayer.dll", EntryPoint = "IP_TPS_OpenStream")]
public static extern int Inptr_Test (int param1, IntPtr hWnd);
在调用的时候就可以向Inptr_Test 的第二个参数传入某一控件的Handle。这里涉及到C#类型与C++类型的对应关系,网上这种有很多,这里就不再赘述,只谈几个经常用到的和经常出错的。
(1)一般对于char* ,void*这种可以直接对应IntPtr,比如在C#中,我们经常用string类型,其转换为IntPtr再传给char*,void*等,转换方法为
string txt="test"; Marshal.StringToCoTaskMemAuto(txt);
这里有时会用StringToCoTaskMemAnsi,不过StringToCoTaskMemAuto自动分配内存就可以了。这样就会将txt的内容复制到非托管的内存块中。
(2)对于结构体,比如有一结构体 StructText,将其转换为Intptr,尽量不要直接用Marshal.StructureToPtr,这样很容易出错。可以这样来用:
int
size = Marshal.SizeOf(StructText);//获取结构体占用空间大小
IntPtr
intptr= Marshal.AllocHGlobal(size);//声明一个同样大小的空间
Marshal.StructureToPtr(StructText, intptr, true);//将结构体放到这个空间中
C#中的IntPtr类型(指针等用)相关推荐
- c#中无法将类型“int”隐式转换为“System.IntPtr”
问: c#中无法将类型"int"隐式转换为"System.IntPtr" 这个是我引用了一个api函数时出现的问题,我在声明中把intptr换成了int还是不可 ...
- C++中void和void*指针的含义 (指针类型的含义)
转载自:http://blog.csdn.net/lee_shuai 指针有两个属性:指向变量/对象的地址和长度,但是指针只存储地址,长度则取决于指针的类型:编译器根据指针的类型从指针指向的地址向后寻 ...
- 结构体前面加星号_C语言中带星号的类型指针有哪些特性
C语言中带星号的类型指针有哪些特性 指针是什么?很多人说,指针就是地址,那这么说的人肯定是对指针有所了解,他们这么说也不能说全错,我只能在这里说:"他们并没有真正学会指针,如果想学好指针,请 ...
- Java中的对象类型像引用还是指针,谁是谁非?
Java中的对象类型像引用还是指针,谁是谁非? 作者:海枫 地址:http://blog.csdn.net/linyt 作为一名程序员,我们应该对新知识和新技术刨根问底,而不应泛泛而谈.我未曾接触到J ...
- C++中野指针和空指针和无类型指针
C++中野指针和空指针和无类型指针https://blog.csdn.net/chenguolinblog/article/details/27054267 一. 野指针 所谓的野指针指的是一个指针变 ...
- c语言中结构体类型定义的函数指针,结构体中定义函数指针
结构体指针变量的定义 定义结构体变量的一般形式如下:形式1:先定义结构体类型,再定义变量struct 结构体标识符{ 成员变量列表;-};struct 结构体标识符 *指针变量名;变量初始化:stru ...
- c语言char指针用法,整理C语言中各种类型指针的特性与用法
2016 指针为什么要区分类型: 在同一种编译器环境下,一个指针变量所占用的内存空间是固定的.比如,在16位编译器环境 下,任何一个指针变量都只占用8个字节,并不会随所指向变量的类型而改变. 虽然所有 ...
- C#中,IntPtr详解
在C#中,IntPtr是一个结构,表示一个指针或处理器的本机大小的有符号整数. 它可以用来保存一个内存地址,也可以使用它访问非托管代码,如Win32 API. IntPtr类型在跨平台开发中很有用,因 ...
- android获取指针空间大小_腾讯笔试题:浅谈计算机中cpu位数和指针
来一个腾讯笔试题 在刷题的时候看到了腾讯笔试题的这个问题 long a = (long)(((int *) 0) + 4);printf("%ld ",a); 请问输出 a 的值是 ...
最新文章
- 用visio画用例图小人_教你如何用 Python 打飞机 ?
- ECLIPSE配置MAVEN
- python成绩管理系统界面-python实现简易版学生成绩管理系统
- eslint git提交不上_Git常用命令及日常问题集锦
- SpringBoot集成七牛云-实现文件上传、下载、解决报错、详细案例
- 过渡效果_12个酷炫创意的动画过渡效果AE模板
- 对称加密和不对称加密原理
- JS中的基本和引用类型传递的比较
- oracle 创建模式语句,ORACLE基本使用SQL语句以及归档模式的操作
- 你最隐秘的性格在哪?
- mybatis中SqlSession一定要关闭
- [LeetCode] 679. 24 Game(回溯法)
- SAP License:如何利用DEBUG强力修改表
- 二阶齐次线性微分方程的通解公式_数学考研辅导(数二)063|高数常微分方程6
- 梦想是如何失去的?看小米和魅族发布有感
- L2-003 月饼 (25 point(s))
- windows 10 l2tp 连接无响应问题解决
- 【深度学习】NLP|用GRU模型给周董写首歌
- 文华财经期货K线多周期画线技术,多重短线技术共振通道线指标公式——多周期主图自动画线
- Datakit.CrossManager.2023(2D/3D数据格式转换器)
热门文章
- jenkins测试c语言接口,Jenkins集成接口测试实践(一)
- 基于python的文件加密传输系统 毕业论文_20183411 李丞灏 2020-2021 《python程序设计》 实验三 加密传输文件 实验报告...
- linux在主函数中调用进程,linux 调用进程
- 非文学翻译理论与实践_北外“欧洲非通用语文学翻译与研究中心”正式成立
- ST:没错,又是我!继续涨价!
- 欧姆龙plc解密实例_西门子、施耐德、欧姆龙等13大PLC品牌8000个实例程序资料包...
- mysql中varchar的存储_mysql的varchar可以存储多少个汉字
- 打印管理 php,window_强化Windows Server 2008下的打印管理, 打印管理从来都是Windows Se - phpStudy...
- 域名怎么绑定ip_服务器怎么绑定域名?
- 没有外层实列可以访问_这糕点外层香酥,内馅香甜可口,让人吃一次就爱上了,做起来...