.NET 3.x Получить список модулей - C#
Формулировка задачи:
Здравствуйте! Существует функция:
Когда программа работает на 32 битной системе, адрес нужного модуля получаю успешно. Если запустить программу на 64 битной системе, функция почему то не видит модулей 32 битных. Как обойти данное ограничение?
public int DllImageAddress(string dllname) { ProcessModuleCollection modules = this.MyProcess[0].Modules; foreach (ProcessModule procmodule in modules) { if (dllname == procmodule.ModuleName) { return (int)procmodule.BaseAddress; } } return -1; }
Решение задачи: «.NET 3.x Получить список модулей»
textual
Листинг программы
[DllImport("psapi.dll", SetLastError = true)] public static extern bool EnumProcessModules(IntPtr hProcess, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U4)] [In][Out] uint[] lphModule, uint cb, [MarshalAs(UnmanagedType.U4)] out uint lpcbNeeded); // и далее в коде: Process[] pc = Process.GetProcessesByName("communicator"); foreach (Process p in pc) { // Setting up the variable for the second argument for EnumProcessModules IntPtr[] hMods = new IntPtr[1024]; GCHandle gch = GCHandle.Alloc(hMods, GCHandleType.Pinned); // Don't forget to free this later IntPtr pModules = gch.AddrOfPinnedObject(); // Setting up the rest of the parameters for EnumProcessModules uint uiSize = (uint)(Marshal.SizeOf(typeof(IntPtr)) * (hMods.Length)); uint cbNeeded = 0; if (EnumProcessModules(p.Handle, pModules, uiSize, out cbNeeded) == 1) { Int32 uiTotalNumberofModules = (Int32)(cbNeeded / (Marshal.SizeOf(typeof(IntPtr)))); for (int i = 0; i < (int)uiTotalNumberofModules; i++) { StringBuilder strbld = new StringBuilder(1024); GetModuleFileNameEx(p.Handle, hMods[i], strbld, (uint)(strbld.Capacity)); Console.WriteLine("File Path: " + strbld.ToString()); Console.WriteLine(); } Console.WriteLine("Number of Modules: " + uiTotalNumberofModules); Console.WriteLine(); } // Must free the GCHandle object gch.Free(); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д