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ć?