`
touchinsert
  • 浏览: 1287855 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

[转]C#中的IntPtr类型

 
阅读更多

本文转自:http://zhidao.baidu.com/question/22825956.html

问:

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

<cd>这个是我引用了一个api函数时出现的问题,我在声明中把intptr换成了int还是不可以,这是为什么呢?要如何处理呢?</cd>
答:
您好,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

    C#中的IntPtr类型称为“平台特定的整数类型”,它们用于本机资源,如窗口句柄。 资源的大小取决于使用的硬件和操作系统,但其大小总是足以包含系统的指针(因此也可以包含资源的名称)。 例如,我们可以在vs2008...

    C# 调用C++ DLL的类型转换

    //C#调用C++的DLL搜集整理的所有数据类型转换方式,可能会有重复或者多种方案,自己多测试 //c++:HANDLE(void *) —- c#:System.IntPtr //c++:Byte(unsigned char) —- c#:System.Byte //c++:SHORT(short) —- c#...

    C#版GDAL-1.11.1编译

    本资源是在64位win7系统下亲测可行的,赶紧下载编译一遍吧。

    C#调用C++版本dll时的类型转换需要注意的问题小结

    C#对于C++的dll引用时,经常会遇到类型转换和struct的转换 1. C++ 里的Char类型是1 个字节,c#里的Char是两个字节,不可以对应使用;可使用c#里的byte对应 2. structType temp = (structType)Marshal.PtrToStructure...

    c# 模拟鼠标点击 DEMO

    c# winform 模拟鼠标点击 DEMO //获取当前窗口句柄:GetForegroundWindow [DllImport("user32.dll", EntryPoint =...返回值类型是IntPtr,即为当前获得焦点窗口的句柄 使用方法 : IntPtr myPtr=GetForegroundWindow();

    C# 图形绘制、可绘制Roil,绘制可调整Roi 7、可查看当前鼠标位置处的图像坐标和像素点RGB值

    1、输入接口多,支持的输入类型有Bitmap(图像),byte[](图像数据), Intptr(图像数据的地址)等。 2、可直接在线程里执行图像显示,不需要使用委托。 3、可以对图像进行放大缩小平移。 4、可用预览图调节图像...

    openCV 水平拆分三张图片实测代码已包含所需动态库文件

    资源里加入了拆分后的图片的质量控制,IntPtr类型的 ptr变量为全局变量,就是它保存着质量控制信息,主方法 名为getThreePicture 返回值是string[]保存着三张拆分后的图片的base64格式字符串信息,主方法前有unsafe...

    【VS2010 C# 代码】简单的鼠标钩子应用实例

    Microsoft Visual Studio 2010做的C#简单的鼠标钩子应用实例实例,实现实时监控鼠标位置(需要编译后,在Release文件夹那里运行)主要代码: public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam...

    C#浏览器编程,学习使用

    在“新建项目”对话框的项目类型窗口中选中“Visual C#”作为项目开发语言,在模板窗口中选中“Windows 应用程序”作为项目开发模板,在“名称”、“位置”编辑框中输入自己设定的项目名字和项目存储位置,本讲义...

    浅谈C#互操作的内存溢出问题

    在C#中我的申明成了这样: public extern void Method(ref uint para); 最初怎么也没有发现这里面有什么问题,知道这个隐藏的问题暴露出来,把前面申明的一个变量改变了, 我才恍然大悟。 代码如下:uint test = 0;...

    FileTypeAndIcon

    C# 根据文件类型获取文件图标 using System; using System.Collections.Generic; using System.Collections; using System.Text; using System.Runtime.InteropServices; using Microsoft.Win32; using System....

    C#图像显示例子SnsPictrueBoxSample v1.5.0,轻松实现图像缩放、图像平移、图像高效显示,绘制可调整Roi

    1、输入接口多,支持的输入类型有Bitmap(图像),byte[](图像数据), Intptr(图像数据的地址)等。 2、可直接在线程里执行图像显示,不需要使用委托。 3、可以对图像进行放大缩小平移。 4、可用预览图调节图像...

    C#与C++之间类型的对应知识点总结

    Windows Data Type .NET Data Type BOOL, BOOLEAN Boolean or Int32 BSTR String BYTE Byte CHAR Char DOUBLE Double ...IntPtr, UintPtr or HandleRef HRESULT I

    关于C# 窗体自动隐藏和加载的问题

    其中一款软件在使用工作时需要截图生成报告,此时不能有其他应用程式界面在显示器桌面显示,故需要自动隐藏和加载窗体,通过阅读Windows API实现了这一功能与大伙分享交流一下:原本C#自带Hide()和Show()方法;...

    PatcherYRpp:用于DynamicPatcher扩展的C#样式YRpp

    C#样式YRpp 指针 建议使用Pointer代替T *。 使用Pointer.Ref访问T的成员。 如果需要转换指针类型,请使用Pointer.Convert()。 IntPtr也具有此扩展功能。 使用Pointer.AsPointer(ref obj)获取对象地址。 ...

    【。net 专业】 面试题

    答:装箱就是把值类型转成引用类型,从MS IL角度看好像是boxing,没记错的话是把值从堆栈转到堆中.拆箱相反,重载就是指一个方法名同,参数个数不同,返回值可以相同的方法.CLR是通用语言运行时,其它的不清楚. 4.列举一下...

    InteropTypes:实验性概念验证低级库,可在成像库之间交换位图

    互操作类型 松散耦合类型的集合,可用于在库之间转换数据。 互操作位图 一种实验性的概念验证低层库,可在成像库之间交换位图。...IntPtr PointerBitmap Span SpanBitmap , SpanBitmap Memory MemoryBitmap

    海康卫视开发dll文件

    #region using System; using System.Diagnostics; using System.IO; using System.Runtime.InteropServices; using System.Text; using System.Threading; using SocketLibrary;... /// &lt;summary...

Global site tag (gtag.js) - Google Analytics