Cześć,
Od pewnego czasu próbuję otrzymać pełną nazwę pliku wykonywalnego dla konkretnego procesu.
Wykorzystuje do tego celu funkcję QueryFullProcessImageNameW z Kernel32.dll.
Oto część mojego kodu:
[DllImport("kernel32.dll")]
private static extern bool QueryFullProcessImageNameW(IntPtr hProcess, int flags, StringBuilder text, int count);
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
private static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);
[DllImport("kernel32.dll")]
private static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
private const int PROCESS_QUERY_LIMITED_INFORMATION = 0x1000;
IntPtr handle = GetForegroundWindow();
const int nChars = 1024;
StringBuilder strBuilder = new StringBuilder(nChars);
GetWindowThreadProcessId(handle, out int processId);
IntPtr hProc = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, false, processId);
QueryFullProcessImageNameW(hProc, 0, strBuilder, nChars);
Ale niestety funkcja QueryFullProcessImageNameW wyrzuca mi wyjątek System.AccessViolationException.
Czy ktoś mógłby mi powiedzieć dlaczego i jak mogę to naprawić?