Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - Получение PID процесса, запущенного из программы

Ответить
Настройки темы
.NET - Получение PID процесса, запущенного из программы

Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


Имеется приложение на C#. В приложении есть опция - создать отчет. Отчет формируется в Excel.

Код: Выделить весь код
 //экземпляр Excel
            oXL = new Excel.Application();
            //экземпляр книги
            oWB = (Excel._Workbook)(oXL.Workbooks.Add(Missing.Value));
            //экземпляр листа
            oSheet = (Excel._Worksheet)oWB.ActiveSheet;
и т.д. Т.е. все стандартно. Формирование отчета запускается в параллельном потоке, и после завершения формирования отчет выводится на экран (excel.Visible=true). Все работает, но иногда, крайне редко (например, отчет слишком большой, а пользователь закрыл программу и забыл что формировал его) в процессах остается экземпляр Excel.
Вот и подумал, может имеет смысл при закрытии программы проверять PID процессов Excel и закрывать их принудительно? В таком случае возникает проблема с уже запущенными клиентом копиями Excel.
Я думал взять список процессов Excel до запуска отчета и после
Код: Выделить весь код
listBoxBefore.Text = System.Diagnostics.Process.GetProcessesByName("Excel")[0].Id.ToString();
listBoxAfter.Text = System.Diagnostics.Process.GetProcessesByName("Excel")[0].Id.ToString();
И при закрытии программы проверять, есть ли в списке новые PID. Но этот вариант мало подходит, т.к. пользователь мог во время работы программы сам запустить дополнительно Excel.
Может есть способ сразу при активации экземпляра Excel из программы, получать его PID? Чтобы быть уверенным на 100%, что закрывается нужное приложение.

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)


Отправлено: 01:52, 04-12-2009

 

Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


Delirium, когда в МультиБут понадобилось определить кто запускал консоль/GUI процесс, нашёл эту тему Как узнать имя процесса-родителя, а там ссылку в посте под номер 4
Тем не менее, код, переписанный с Делфи на С, не добавил, так как представил, что помимо explorer.exe и cmd.exe, программу может запускать totalcmd.exe, far.exe и т.д., что делает данный подход не надёжным.


Код: Выделить весь код
#define PSAPI_VERSION 1

#include <windows.h>
#include <stdio.h>
#include <Winternl.h>
#include <Psapi.h>

#pragma comment(lib, "Psapi.lib")

int WINAPI wWinMain (HINSTANCE hThisInst, HINSTANCE hPrevInst, LPWSTR lpszArgs, int nWinMode)
{
	HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, GetCurrentProcessId());
	if(hProcess == INVALID_HANDLE_VALUE)
		return -1;

	HMODULE hNtDll = LoadLibrary(L"ntdll.dll");
	if(hNtDll == NULL)
		return -1;

	typedef NTSTATUS (NTAPI *pfnNtQueryInformationProcess)(
		IN  HANDLE ProcessHandle,
		IN  PROCESSINFOCLASS ProcessInformationClass,
		OUT PVOID ProcessInformation,
		IN  ULONG ProcessInformationLength,
		OUT PULONG ReturnLength    OPTIONAL
		);

	pfnNtQueryInformationProcess gNtQueryInformationProcess = (pfnNtQueryInformationProcess)GetProcAddress(hNtDll, "NtQueryInformationProcess");
    if(gNtQueryInformationProcess == NULL)
	{
        FreeLibrary(hNtDll);
        return -1;
    }
	
	typedef struct _PROCESS_BASIC_INFORMATION {
		NTSTATUS ExitStatus;
		PPEB PebBaseAddress;
		ULONG_PTR AffinityMask;
		LONG BasePriority;
		ULONG_PTR UniqueProcessId;
		ULONG_PTR InheritedFromUniqueProcessId;
	};
	_PROCESS_BASIC_INFORMATION Info ={0};

	gNtQueryInformationProcess(hProcess, ProcessBasicInformation, &Info, sizeof(Info), NULL);// == NO_ERROR)
	CloseHandle(hProcess);
	
	hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, (DWORD)Info.InheritedFromUniqueProcessId);
	wchar_t szFileName[MAX_PATH] = L"";
	GetModuleFileNameEx(hProcess, NULL, szFileName, MAX_PATH);
	CloseHandle(hProcess);

	MessageBox(NULL, szFileName, L"Hi", MB_ICONINFORMATION);
	
	if(hNtDll != NULL)
		FreeLibrary(hNtDll);

	return 0;
}
На C# наверное можно перенести, а там и в Excel.
Не писал под .NET в Excel, так что не знаю нюансов, но разве при запуске второго экземпляра Excel не создаёт новой вкладке в своём окне? Или с рапортами выделяется отдельный поток и всё?
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:01, 05-12-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


Цитата Admiral:
разве при запуске второго экземпляра Excel не создаёт новой вкладке в своём окне »
Это зависит от настроек самого Excel. У меня всегда открывает новое окно при формировании запроса, тестировал на Excel 2003 и 2007 с разными настройками.

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)


Отправлено: 02:17, 07-12-2009 | #3



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - Получение PID процесса, запущенного из программы

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Помогите с написанием bat файла для проверки запущенного процесса. Stranger404 Скриптовые языки администрирования Windows 17 17-08-2020 22:50
Проверка запущенного процесса Anarasius AutoIt 2 25-06-2014 11:39
Разное - [решено] Что такое PID процесса ? S-400 Microsoft Windows 2000/XP 3 09-05-2009 14:48
Java - Отслеживание состояния запущенного процесса EvgeniyQQQ Программирование и базы данных 15 02-10-2007 13:20
А можно для уже запущенного процесса сменить user-a ? ukms Программирование и базы данных 6 23-10-2002 13:51




 
Переход