c#中无法将类型“int”隐式转换为“System.IntPtr”

这个是我引用了一个api函数时出现的问题,我在声明中把intptr换成了int还是不可以,这是为什么呢?要如何处理呢?
答:
您好,C#中的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类型(指针等用)相关推荐

  1. c#中无法将类型“int”隐式转换为“System.IntPtr”

    问: c#中无法将类型"int"隐式转换为"System.IntPtr" 这个是我引用了一个api函数时出现的问题,我在声明中把intptr换成了int还是不可 ...

  2. C++中void和void*指针的含义 (指针类型的含义)

    转载自:http://blog.csdn.net/lee_shuai 指针有两个属性:指向变量/对象的地址和长度,但是指针只存储地址,长度则取决于指针的类型:编译器根据指针的类型从指针指向的地址向后寻 ...

  3. 结构体前面加星号_C语言中带星号的类型指针有哪些特性

    C语言中带星号的类型指针有哪些特性 指针是什么?很多人说,指针就是地址,那这么说的人肯定是对指针有所了解,他们这么说也不能说全错,我只能在这里说:"他们并没有真正学会指针,如果想学好指针,请 ...

  4. Java中的对象类型像引用还是指针,谁是谁非?

    Java中的对象类型像引用还是指针,谁是谁非? 作者:海枫 地址:http://blog.csdn.net/linyt 作为一名程序员,我们应该对新知识和新技术刨根问底,而不应泛泛而谈.我未曾接触到J ...

  5. C++中野指针和空指针和无类型指针

    C++中野指针和空指针和无类型指针https://blog.csdn.net/chenguolinblog/article/details/27054267 一. 野指针 所谓的野指针指的是一个指针变 ...

  6. c语言中结构体类型定义的函数指针,结构体中定义函数指针

    结构体指针变量的定义 定义结构体变量的一般形式如下:形式1:先定义结构体类型,再定义变量struct 结构体标识符{ 成员变量列表;-};struct 结构体标识符 *指针变量名;变量初始化:stru ...

  7. c语言char指针用法,整理C语言中各种类型指针的特性与用法

    2016 指针为什么要区分类型: 在同一种编译器环境下,一个指针变量所占用的内存空间是固定的.比如,在16位编译器环境 下,任何一个指针变量都只占用8个字节,并不会随所指向变量的类型而改变. 虽然所有 ...

  8. C#中,IntPtr详解

    在C#中,IntPtr是一个结构,表示一个指针或处理器的本机大小的有符号整数. 它可以用来保存一个内存地址,也可以使用它访问非托管代码,如Win32 API. IntPtr类型在跨平台开发中很有用,因 ...

  9. android获取指针空间大小_腾讯笔试题:浅谈计算机中cpu位数和指针

    来一个腾讯笔试题 在刷题的时候看到了腾讯笔试题的这个问题 long a = (long)(((int *) 0) + 4);printf("%ld ",a); 请问输出 a 的值是 ...

最新文章

  1. 用visio画用例图小人_教你如何用 Python 打飞机 ?
  2. ECLIPSE配置MAVEN
  3. python成绩管理系统界面-python实现简易版学生成绩管理系统
  4. eslint git提交不上_Git常用命令及日常问题集锦
  5. SpringBoot集成七牛云-实现文件上传、下载、解决报错、详细案例
  6. 过渡效果_12个酷炫创意的动画过渡效果AE模板
  7. 对称加密和不对称加密原理
  8. JS中的基本和引用类型传递的比较
  9. oracle 创建模式语句,ORACLE基本使用SQL语句以及归档模式的操作
  10. 你最隐秘的性格在哪?
  11. mybatis中SqlSession一定要关闭
  12. [LeetCode] 679. 24 Game(回溯法)
  13. SAP License:如何利用DEBUG强力修改表
  14. 二阶齐次线性微分方程的通解公式_数学考研辅导(数二)063|高数常微分方程6
  15. 梦想是如何失去的?看小米和魅族发布有感
  16. L2-003 月饼 (25 point(s))
  17. windows 10 l2tp 连接无响应问题解决
  18. 【深度学习】NLP|用GRU模型给周董写首歌
  19. 文华财经期货K线多周期画线技术,多重短线技术共振通道线指标公式——多周期主图自动画线
  20. Datakit.CrossManager.2023(2D/3D数据格式转换器)

热门文章

  1. jenkins测试c语言接口,Jenkins集成接口测试实践(一)
  2. 基于python的文件加密传输系统 毕业论文_20183411 李丞灏 2020-2021 《python程序设计》 实验三 加密传输文件 实验报告...
  3. linux在主函数中调用进程,linux 调用进程
  4. 非文学翻译理论与实践_北外“欧洲非通用语文学翻译与研究中心”正式成立
  5. ST:没错,又是我!继续涨价!
  6. 欧姆龙plc解密实例_西门子、施耐德、欧姆龙等13大PLC品牌8000个实例程序资料包...
  7. mysql中varchar的存储_mysql的varchar可以存储多少个汉字
  8. 打印管理 php,window_强化Windows Server 2008下的打印管理,  打印管理从来都是Windows Se - phpStudy...
  9. 域名怎么绑定ip_服务器怎么绑定域名?
  10. 没有外层实列可以访问_这糕点外层香酥,内馅香甜可口,让人吃一次就爱上了,做起来...