zoukankan      html  css  js  c++  java
  • C# 动态调用DLL

    本来是想实现控制台程序运行时自动全屏,但是只找到VC下的实现方法(http://www.vckbase.com/bbs/prime/viewprime.asp?id=347)。

    其中要使用两个未公开的Win32 API函数来存取控制台窗口,这就需要使用动态调用的方法,动态调用中使用的Windows API函数主要有三个,即:Loadlibrary,GetProcAddress和Freelibrary。步骤如下:

    1.   Loadlibrary: 装载指定DLL动态库

    2.   GetProcAddress:获得函数的入口地址

    3.   Freelibrary: 从内存中卸载动态库

    但是C#中是没有函数指针,无法直接使用GetProcAddress返回的入口地址。后来找到资料,其实.NET 2.0新增了Marshal.GetDelegateForFunctionPointer 方法可以满足这个要求,MSDN里的解释是:将非托管函数指针转换为委托。

    后面的事就简单啦,我把它编成了一个类来方便调用。

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;

    namespace feiyun0112.cnblogs.com
    {
        public class DllInvoke
        {

            Win API

            private IntPtr hLib;        
            public DllInvoke(String DLLPath)
            {
                hLib = LoadLibrary(DLLPath);
            }


            ~DllInvoke()
            {
                FreeLibrary(hLib);            
            }


            //将要执行的函数转换为委托
            public Delegate Invoke (string APIName,Type t)  
            {
                IntPtr api = GetProcAddress(hLib, APIName);
                return (Delegate)Marshal.GetDelegateForFunctionPointer(api, t);
            }


        }

    }


    下面是使用的例子:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    using feiyun0112.cnblogs.com;

    namespace ConsoleApplication1
    {
        class Program
        {
            Win API

            public delegate bool SetConsoleDisplayMode(IntPtr hOut, int dwNewMode, out int lpdwOldMode);

            static void Main(string[] args)
            {
                DllInvoke dll = new DllInvoke("kernel32.dll");
                
                int dwOldMode;

                //标准输出句柄
                IntPtr hOut = GetStdHandle(STD_OUTPUT_HANDLE);
                
                //调用Win API,设置屏幕最大化
                SetConsoleDisplayMode s = (SetConsoleDisplayMode)dll.Invoke("SetConsoleDisplayMode", typeof(SetConsoleDisplayMode));
                s(hOut, 1, out dwOldMode);

                Console.WriteLine("********************Full Screen Mode********************");
                Console.ReadLine();
               
            }

        }

    }

  • 相关阅读:
    姐姐的vue(1)
    LeetCode 64. Minimum Path Sum 20170515
    LeetCode 56. 56. Merge Intervals 20170508
    LeetCode 26. Remove Duplicates from Sorted Array
    LeetCode 24. Swap Nodes in Pairs 20170424
    LeetCode 19. Remove Nth Node From End of List 20170417
    LeetCode No.9 Palindrome Number 20170410
    LeetCode No.8. String to Integer (atoi) 2017/4/10(补上一周)
    LeetCode No.7 Reverse Integer 2017/3/27
    LeetCode No.4 Median of Two Sorted Arrays 20170319
  • 原文地址:https://www.cnblogs.com/lizi/p/2363090.html
Copyright © 2011-2022 走看看