.NET 3.x Получить список модулей - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Существует функция:
Листинг программы
  1. public int DllImageAddress(string dllname)
  2. {
  3. ProcessModuleCollection modules = this.MyProcess[0].Modules;
  4. foreach (ProcessModule procmodule in modules)
  5. {
  6. if (dllname == procmodule.ModuleName)
  7. {
  8. return (int)procmodule.BaseAddress;
  9. }
  10. }
  11. return -1;
  12. }
Когда программа работает на 32 битной системе, адрес нужного модуля получаю успешно. Если запустить программу на 64 битной системе, функция почему то не видит модулей 32 битных. Как обойти данное ограничение?

Решение задачи: «.NET 3.x Получить список модулей»

textual
Листинг программы
  1. [DllImport("psapi.dll", SetLastError = true)]
  2. public static extern bool EnumProcessModules(IntPtr hProcess,
  3. [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U4)] [In][Out] uint[] lphModule, uint cb, [MarshalAs(UnmanagedType.U4)] out uint lpcbNeeded);
  4.  
  5. // и далее в коде:        
  6.         Process[] pc = Process.GetProcessesByName("communicator");
  7.  
  8.         foreach (Process p in pc)
  9.         {
  10.         // Setting up the variable for the second argument for EnumProcessModules
  11.         IntPtr[] hMods = new IntPtr[1024];
  12.  
  13.         GCHandle gch = GCHandle.Alloc(hMods, GCHandleType.Pinned); // Don't forget to free this later
  14.         IntPtr pModules = gch.AddrOfPinnedObject();
  15.  
  16.         // Setting up the rest of the parameters for EnumProcessModules
  17.         uint uiSize = (uint)(Marshal.SizeOf(typeof(IntPtr)) * (hMods.Length));
  18.         uint cbNeeded = 0;
  19.  
  20.         if (EnumProcessModules(p.Handle, pModules, uiSize, out cbNeeded) == 1)
  21.         {
  22.             Int32 uiTotalNumberofModules = (Int32)(cbNeeded / (Marshal.SizeOf(typeof(IntPtr))));
  23.  
  24.             for (int i = 0; i < (int)uiTotalNumberofModules; i++)
  25.             {
  26.             StringBuilder strbld = new StringBuilder(1024);
  27.  
  28.             GetModuleFileNameEx(p.Handle, hMods[i], strbld, (uint)(strbld.Capacity));
  29.             Console.WriteLine("File Path: " + strbld.ToString());
  30.             Console.WriteLine();
  31.             }
  32.             Console.WriteLine("Number of Modules: " + uiTotalNumberofModules);
  33.             Console.WriteLine();
  34.         }
  35.  
  36.         // Must free the GCHandle object
  37.         gch.Free();
  38.         }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут