[DllImport("psapi.dll")]
static extern uint GetModuleFileNameEx(IntPtr hProcess, IntPtr hModule, [Out] StringBuilder lpBaseName, [In] [MarshalAs(UnmanagedType.U4)] int nSize);
<DllImport("psapi.dll")> _
Public Shared Function GetModuleFileNameEx(ByVal hProcess As IntPtr, ByVal hModule As IntPtr, <Out()> ByVal lpBaseName As StringBuilder, <[In]()> <MarshalAs(UnmanagedType.U4)> ByVal nSize As Integer) As UInteger
End Function
None.
Do you know one? Please contribute it!
I had trouble using the original C# signature above, but found that this one works:
[DllImport("psapi.dll", CallingConvention=CallingConvention.StdCall, CharSet=CharSet.Unicode)]
static extern uint GetModuleFileNameEx(IntPtr hProcess, IntPtr hModule, [Out] StringBuilder lpBaseName, uint nSize);
Please add some!
Using this method in conjuction with EnumProcessModules:
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();
}