zoukankan      html  css  js  c++  java
  • .net调用windowsAPI的总结

          最近一直在找工作,各种笔试面试,各种讨价还价,着实累的不行。不过幸好在这些奔波的日子里能学到不少东西,也明白了自己的不足,更加重要的是让自己明白了做技术挺适合自己。

    今天通过一个小的例子来总结C#如何调用系统API的。例子很小,主要解决的是控制台输出(console.write这个方法在打印一定量数据的时候会罢工)的一个帮助类。

         下面直接上代码进行说明:

       /// <summary>
        /// 解决Console.Write写大量字符串异常
        /// </summary>
        public sealed class ConsoleHelper
        {
            public static IntPtr OutHandle
            {
                get
                {
                    if (outHandle == IntPtr.Zero)
                        outHandle = GetStdHandle(StdHandle.STD_OUTPUT_HANDLE);
                    return outHandle;
                }
            }
    
            public static void Write(string value)
            {
                if (OutHandle == IntPtr.Zero)
                    return;
                int numberOfCharsWritten;
                char[] valueArray = value.ToCharArray();
                WriteConsole(outHandle, valueArray, System.Text.Encoding.GetEncoding("GB2312").GetBytes(value).Length, out numberOfCharsWritten, 0);
            }
    
            public static void Write(string format, params Object[] arg)
            {
                Write(string.Format(format, arg));
            }
    
            public static void WriteLine(string value)
            {
                Write(value + Environment.NewLine);
            }
    
            public static void WriteLine(string format, params Object[] arg)
            {
                Write(format + Environment.NewLine, arg);
            }
    
            enum StdHandle
            {
                STD_INPUT_HANDLE = -10,
                STD_OUTPUT_HANDLE = -11,
                STD_ERROR_HANDLE = -12
            }
    
            [System.Runtime.InteropServices.DllImport("Kernel32.dll")]
            static extern IntPtr GetStdHandle(StdHandle nStdHandle);
    
            [System.Runtime.InteropServices.DllImport("Kernel32.dll")]
            static extern int WriteConsole(
                    IntPtr hConsoleOutput,
                    char[] lpBuffer,
                    int nNumberOfCharsToWrite,
                    out int lpNumberOfCharsWritten,
                    int lpReserved
            );
    
            static IntPtr outHandle = IntPtr.Zero;
        }
    View Code

     从上面的代码,我们可以发现调用系统的API基本有以下几个步骤:

    1、找到你需要的系统API,并从中找到你需要的方法。上面的API是“Kernel32.dll“,需要的方法是static extern int WriteConsole(para1,para2,para3,para4)。

    2、引用你的系统API([System.Runtime.InteropServices.DllImport("Kernel32.dll")]),构建你的方法参数(因为系统API中的方法只能识别它本身封装好的参数)。

         在上面的例子中我们自定义了一个枚举,并引用了另一个系统方法,目的是构造我们需要方法的参数。

    3、同调用任何方法一样调用我们引用的方法。

  • 相关阅读:
    PHP 载入图像 imagecreatefrom_gif_jpeg_png 系列函数
    PHP 输出图像 imagegif 、imagejpeg 与 imagepng 函数
    php实现等比例不失真缩放上传图片
    PHP开发框架--CodeIgniter(CI)使用总结
    将Centos的yum源更换为国内的阿里云源
    开始投资的活动条件是什么
    复利效应 每天进步一点点到底指的是什么?
    你拥有的最宝贵的财富是什么?
    自律真的可以改变人生
    chpasswd-批量修改用户密码
  • 原文地址:https://www.cnblogs.com/liehuochongsheng/p/4499491.html
Copyright © 2011-2022 走看看