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 }
  • 相关阅读:
    黄聪:Delphi 中的 XMLDocument 类详解(6) 访问节点属性
    黄聪:Delphi 中的 XMLDocument 类详解(8) 添加与删除节点
    黄聪:Delphi 中的 XMLDocument 类详解(15) 创建与保存 xml
    黄聪:Delphi 中的 XMLDocument 类详解(9) 关于 HasChildNodes 与 IsTextElement
    黄聪:Delphi 中的 XMLDocument 类详解(4) 获取根目录下的元素数
    黄聪:Delphi 中的 XMLDocument 类详解(14) 遍历 XML 文件
    黄聪:Delphi 中的 XMLDocument 类详解(13) 关于 XML 属性
    黄聪:Delphi 中的 XMLDocument 类详解(3) 读取 xml 文件
    黄聪:Delphi 中的 XMLDocument 类详解(20) 动态建立 XMLDocument 对象
    黄聪:Delphi 中的 XMLDocument 类详解(5) 获取元素内容
  • 原文地址:https://www.cnblogs.com/Bob-wei/p/7765319.html
Copyright © 2011-2022 走看看