zoukankan      html  css  js  c++  java
  • 用 LoadLibraryExW 函数测试加载 dll (CSharp、Windows)

    效果如下:

    $ llbtest "E:Developeremgucv-windesktop 3.3.0.2824libsx64"
    LoadLibraryExW PATH: E:Developeremgucv-windesktop 3.3.0.2824libsx64
    E:Developeremgucv-windesktop 3.3.0.2824libsx64concrt140.dll......[OK] 140734063771648......Free: [OK]
    E:Developeremgucv-windesktop 3.3.0.2824libsx64cvextern.dll......[OK] 140733428531200......Free: [OK]
    E:Developeremgucv-windesktop 3.3.0.2824libsx64msvcp140.dll......[OK] 140734063509504......Free: [OK]
    E:Developeremgucv-windesktop 3.3.0.2824libsx64opencv_ffmpeg330_64.dll......[OK] 1724645376......Free: [OK]
    E:Developeremgucv-windesktop 3.3.0.2824libsx64vcruntime140.dll......[OK] 140734064033792......Free: [OK]
    -- Completed --

    llbtest.cs 源代码:

    用csc llbtest.cs编译即可

     1 using System;
     2 using System.ComponentModel;
     3 using System.IO;
     4 using System.Runtime.InteropServices;
     5 
     6 class Program
     7 {
     8     static void Main(string[] args)
     9     {
    10         if (args.Length == 0 || args.Length > 2)
    11         {
    12             ShowHelp();
    13             return;
    14         }
    15         var path = args[0];
    16         if (!Directory.Exists(path))
    17         {
    18             ShowHelp();
    19             return;
    20         }
    21 
    22         var files = Directory.EnumerateFiles(path, "*.dll");
    23         Console.WriteLine($"LoadLibraryExW PATH: {path}");
    24         foreach (var file in files)
    25         {
    26             Console.Write(file);
    27             const int loadLibrarySearchDllLoadDir = 0x00000100;
    28             const int loadLibrarySearchDefaultDirs = 0x00001000;
    29             //const int loadLibrarySearchUserDirs = 0x00000400;
    30             IntPtr handler = NativeMethods.LoadLibraryExW(file, IntPtr.Zero, loadLibrarySearchDllLoadDir | loadLibrarySearchDefaultDirs);
    31             //IntPtr handler = LoadLibraryEx(dllname, IntPtr.Zero, loadLibrarySearchUserDirs);
    32             if (handler == IntPtr.Zero)
    33             {
    34                 var error = Marshal.GetLastWin32Error();
    35                 var ex = new Win32Exception(error);
    36                 Console.WriteLine($"......[ERROR] {ex.NativeErrorCode}: {ex.Message}");
    37             }
    38             else
    39             {
    40                 Console.Write($"......[OK] {handler}");
    41                 var freeLibrary = NativeMethods.FreeLibrary(handler);
    42                 Console.WriteLine($"......Free: {(freeLibrary ? "[OK]" : "[ERROR]")}");
    43             }
    44         }
    45         Console.WriteLine("-- Completed --");
    46         if(args.Length == 2 && args[1] == "...")
    47         {
    48             Console.Write("Press any key to exit...");
    49             Console.ReadKey(true);
    50             Console.WriteLine();
    51         }
    52     }
    53 
    54     private static void ShowHelp()
    55     {
    56         var x = AppDomain.CurrentDomain.FriendlyName;
    57         Console.WriteLine($"Usage:
    	{x} <path> [...]
    	path	The directory path that includes *.dll files
    	...	Pause me when completed.");
    58     }
    59 }
    60 
    61 
    62 
    63 
    64 
    65 [StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
    66 public struct HINSTANCE__
    67 {
    68 
    69     /// int
    70     public int unused;
    71 }
    72 
    73 public partial class NativeMethods
    74 {
    75 
    76     /// Return Type: HMODULE->HINSTANCE->HINSTANCE__*
    77     ///lpLibFileName: LPCWSTR->WCHAR*
    78     ///hFile: HANDLE->void*
    79     ///dwFlags: DWORD->unsigned int
    80     [DllImport("kernel32.dll", EntryPoint = "LoadLibraryExW", SetLastError = true)]
    81     public static extern System.IntPtr LoadLibraryExW([In()] [MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr)] string lpLibFileName, System.IntPtr hFile, uint dwFlags);
    82 
    83 
    84     /// Return Type: BOOL->int
    85     ///hLibModule: HMODULE->HINSTANCE->HINSTANCE__*
    86     [DllImport("kernel32.dll", EntryPoint = "FreeLibrary")]
    87     [return: MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)]
    88     public static extern bool FreeLibrary([In()] System.IntPtr hLibModule);
    89 }
  • 相关阅读:
    从Memcache转战Redis,聊聊缓存使用填过的“坑”
    python playbook 启动redis
    《非常网管:网络管理从入门到精通(修订版)》——第1章 网络基础知识回顾1.1 计算机网络基础...
    《非常网管:网络管理从入门到精通(修订版)》——第1章 网络基础知识回顾1.1 计算机网络基础...
    《Python游戏编程快速上手》——1.3 如何使用本书
    《Python游戏编程快速上手》——1.3 如何使用本书
    《Python游戏编程快速上手》——1.3 如何使用本书
    《Arduino实战》——3.4 小结
    《Arduino实战》——3.4 小结
    《Arduino实战》——3.4 小结
  • 原文地址:https://www.cnblogs.com/Bob-wei/p/7765319.html
Copyright © 2011-2022 走看看