zoukankan      html  css  js  c++  java
  • C# IntPtr类型

    一:什么是IntPtr

    先来看看MSDN上说的:用于表示指针或句柄的平台特定类型。这个其实说出了这样两个事实,IntPtr 可以用来表示指针或句柄、它是一个平台特定类型。

    C#中的IntPtr类型称为“平台特定的整数类型”,它们用于本机资源,如窗口句柄。资源的大小取决于使用的硬件和操作系统,但其大小总是足以包含系统的指针(因此也可以包含资源的名称)。所以,在您调用的API函数中一定有类似窗体句柄这样的参数,那么当您声明这个函数时,您应该将它显式地声明为IntPtr类型。

    例如,在一个C#程序中调用Win32API mciSendString函数控制光盘驱动器,这个函数的函数原型是:

    1 MCIERROR mciSendString( 
    2 LPCTSTR lpszCommand, 
    3 LPTSTR lpszReturnString, 
    4 UINT cchReturn, 
    5 HANDLE hwndCallback 
    6 ); 

    首先在C#中声明这个函数:

    1 [DllImport("winmm.dll")] 
    2 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);

    二、这里有两点比较重要:

    1、在C#中声明Win32API时,一定要按照WinAPI的原型来声明,不要改变它的数据类型;

    2、是尽量不要过多使用类型强制转换或构造函数的方式初始化一个IntPtr类型的变量,这样会使程序变得难于理解并容易出错。

    三、用在什么地方

    (1)C#调用WIN32 API时

    (2)C#调用C/C++写的DLL时(其实和1相同,只是这个一般是我们在和他人合作开发时经常用到)

  • 相关阅读:
    如何在iTerm2中配置oh my zsh?
    sublime中格式化jsx文件
    ES6 new syntax of Literal
    ES6 new syntax of Rest and Spread Operators
    How to preview html file in our browser at sublime text?
    ES6 new syntax of Default Function Parameters
    ES6 new syntax of Arrow Function
    七牛云2018春招笔试题
    Spring-使用注解开发(十二)
    Spring-声明式事物(十一)
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/15098827.html
Copyright © 2011-2022 走看看