При выполнении следующего кода GetWindowThreadProcessId
возвращает 0. Я читал о та же проблема, возникающая со службой , но этот код запускается как пул приложений в IIS (а именно, w3wp .EXE). Кроме того, и w3wp.exe, и файл EXCEL.EXE, который он пытается уничтожить, работают в одном сеансе (сеанс 0) и под одним и тем же пользователем.
if (appClassXls != null)
{
IntPtr processId = default(IntPtr);
GetWindowThreadProcessId(appClassXls.Hwnd, out processId);
Process processXls = Process.GetProcessById(processId.ToInt32());
if (processXls != null)
{
processXls.Kill();
}
}
Очевидно, что этот код завершается ошибкой, так как он попытается уничтожить pid 0, который является процессом простоя системы вместо экземпляра приложения Excel, который он пытается уничтожить. Почему GetWindowThreadProcessId
возвращает 0 при вызове из w3wp.exe в том же сеансе, что и тот же пользователь? И как мне заставить его вернуть правильный pid?
Windows Server 2008 R2 Standard (64-разрядная версия)
IIS 7.5
.NET Framework v4.0
Microsoft Office Professional Plus 2010 (чистая установка, настройка для запуска от имени определенного пользователя в настройке DCOM, запускается w3wp.exe)
ОБНОВЛЕНИЕ (2011-02-17 08:33 UTC):
Я только что понял, что w3wp.exe запускается с помощью «svchost.exe -k iissvcs», который соответствует «Службе публикации в Интернете», а «Служба активации процессов Windows» и EXCEL.EXE запускаются с помощью «svchost.exe -k». DcomLaunch », что соответствует« Средству запуска процесса DCOM Server », все 3 из которых являются сервисами. Оба файла svchost.exe работают как SYSTEM в сеансе 0, поэтому я до сих пор не понимаю, почему у них или их детей возникли проблемы с доступом друг к другу.