本文转自: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类型称为“平台特定的整数类型”,它们用于本机资源,如窗口句柄。 资源的大小取决于使用的硬件和操作系统,但其大小总是足以包含系统的指针(因此也可以包含资源的名称)。 例如,我们可以在vs2008...
//C#调用C++的DLL搜集整理的所有数据类型转换方式,可能会有重复或者多种方案,自己多测试 //c++:HANDLE(void *) —- c#:System.IntPtr //c++:Byte(unsigned char) —- c#:System.Byte //c++:SHORT(short) —- c#...
本资源是在64位win7系统下亲测可行的,赶紧下载编译一遍吧。
C#对于C++的dll引用时,经常会遇到类型转换和struct的转换 1. C++ 里的Char类型是1 个字节,c#里的Char是两个字节,不可以对应使用;可使用c#里的byte对应 2. structType temp = (structType)Marshal.PtrToStructure...
c# winform 模拟鼠标点击 DEMO //获取当前窗口句柄:GetForegroundWindow [DllImport("user32.dll", EntryPoint =...返回值类型是IntPtr,即为当前获得焦点窗口的句柄 使用方法 : IntPtr myPtr=GetForegroundWindow();
1、输入接口多,支持的输入类型有Bitmap(图像),byte[](图像数据), Intptr(图像数据的地址)等。 2、可直接在线程里执行图像显示,不需要使用委托。 3、可以对图像进行放大缩小平移。 4、可用预览图调节图像...
资源里加入了拆分后的图片的质量控制,IntPtr类型的 ptr变量为全局变量,就是它保存着质量控制信息,主方法 名为getThreePicture 返回值是string[]保存着三张拆分后的图片的base64格式字符串信息,主方法前有unsafe...
Microsoft Visual Studio 2010做的C#简单的鼠标钩子应用实例实例,实现实时监控鼠标位置(需要编译后,在Release文件夹那里运行)主要代码: public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam...
在“新建项目”对话框的项目类型窗口中选中“Visual C#”作为项目开发语言,在模板窗口中选中“Windows 应用程序”作为项目开发模板,在“名称”、“位置”编辑框中输入自己设定的项目名字和项目存储位置,本讲义...
在C#中我的申明成了这样: public extern void Method(ref uint para); 最初怎么也没有发现这里面有什么问题,知道这个隐藏的问题暴露出来,把前面申明的一个变量改变了, 我才恍然大悟。 代码如下:uint test = 0;...
C# 根据文件类型获取文件图标 using System; using System.Collections.Generic; using System.Collections; using System.Text; using System.Runtime.InteropServices; using Microsoft.Win32; using System....
1、输入接口多,支持的输入类型有Bitmap(图像),byte[](图像数据), Intptr(图像数据的地址)等。 2、可直接在线程里执行图像显示,不需要使用委托。 3、可以对图像进行放大缩小平移。 4、可用预览图调节图像...
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
其中一款软件在使用工作时需要截图生成报告,此时不能有其他应用程式界面在显示器桌面显示,故需要自动隐藏和加载窗体,通过阅读Windows API实现了这一功能与大伙分享交流一下:原本C#自带Hide()和Show()方法;...
C#样式YRpp 指针 建议使用Pointer代替T *。 使用Pointer.Ref访问T的成员。 如果需要转换指针类型,请使用Pointer.Convert()。 IntPtr也具有此扩展功能。 使用Pointer.AsPointer(ref obj)获取对象地址。 ...
答:装箱就是把值类型转成引用类型,从MS IL角度看好像是boxing,没记错的话是把值从堆栈转到堆中.拆箱相反,重载就是指一个方法名同,参数个数不同,返回值可以相同的方法.CLR是通用语言运行时,其它的不清楚. 4.列举一下...
互操作类型 松散耦合类型的集合,可用于在库之间转换数据。 互操作位图 一种实验性的概念验证低层库,可在成像库之间交换位图。...IntPtr PointerBitmap Span SpanBitmap , SpanBitmap Memory MemoryBitmap
#region using System; using System.Diagnostics; using System.IO; using System.Runtime.InteropServices; using System.Text; using System.Threading; using SocketLibrary;... /// <summary...