Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: как определить - что процесс уже запущен?  (Прочитано 18181 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 20-10-2004 16:43 » 

а точнее - если проге для работы нужна запущенная Firebird, как определить, что птица ещё не запущена - и запустить автоматом?

просто такое -

CString file="C:\\Program Files\\Firebird\\Firebird_1_5\\bin\\fbguard.exe";
::ShellExecute(m_hWnd,NULL,file,NULL,NULL,SW_SHOW);

не подойдёт, так как ничего не ломается, но если птица уже в памяти - выскакивает окошко об этом - такого не хочу окошка.

подскажите - мож параметры какие птице надо в строке передать?
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 20-10-2004 19:32 » 

Алексей1153, К сказанному в Аське. Вот отрывок из книги Рихтера.
Цитата

Перечисление процессов, выполняемых в системе

Многие разработчики программного обеспечения пытаются создавать инструментальные средства или утилиты для Windows, требующие перечисления процессов, выполняемых в системе. Изначально в Windows API не было функций, которые позволяли бы это делать. Однако в Windows NT ведется постоянно обновляемая база данных Performance Data. В ней содержится информации, доступ к которой через функции ресстра вроде RegQueryValueEx, для которой надо указать корневой раздел HKEY_PERFORMANCE_DATA. Мало кто из программистов знает об этой базе данных, и причины тому кроются, на мой взгляд, в следующем.

1. Для нее не предусмотрено никаких специфических функций, нужно исполь зовать обычные функции реестра.
2. Ее нет в Windows 95 и Windows 98.
3. Структура информации в этой базе данных очень сложна; многие просто избегают ею пользоваться (и другим не советуют).

Чтобы упростить работу с этой базой данных, Microsoft создала набор функций под общим названием Performance Data Helper (содержащийся в PDH.dll). Если Вас интересует более подробная информация о библиотеке PDH.dll, ищите раздел по функциям Performance Data Helper в документации Platform SDK

Как я уже упоминал, в Windows 95 и Windows 98 такой базы данных нет. Вместо них предусмотрен набор функций, позволяющих перечислять процессы. Они включены в ToolHelp API За информацией о них я вновь отсылаю Вас к документации Platform SDK — ищите разделы по функциям Process32First и Process32Next,

Но самое смешное, что разработчики Windows NT, которым ToolHelp-функции явно не нравятся, не включили их в Windows NT. Для перечисления процессов они создали свой набор функций под общим названием Process Status (содержащийся в PSAPI.dll). Так что ищите в документации Platform SDK раздел по функции Enum Processes.

Microsoft, которая до сих пор, похоже, старалась усложнить жизнь разработчи кам инструментальных средств и утилит, все же включила ToolHelp-функции в Win dows 2000. Наконец-то и эти разработчики смогут унифицировать свой код хотя бы для Windows 95, Windows 98 и Windows 2000!

Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 20-10-2004 19:41 » 

И еше две функции
Цитата

The GlobalFindAtom function searches the global atom table for the specified character string and retrieves the global atom associated with that string.

ATOM GlobalFindAtom(

    LPCTSTR lpString    // pointer to the string to find  
   );   
 

Parameters

lpString

Points to the null-terminated character string to search for.

 

Return Values

If the function succeeds, the return value is the global atom associated with the given string.
If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks

Even though Windows preserves the case of a string in an atom table as it was originally entered, the search performed by GlobalFindAtom is not case sensitive.


Цитата

The GetAtomName function retrieves a copy of the character string associated with the specified local atom. This function replaces the GetAtomHandle function.

UINT GetAtomName(

    ATOM nAtom,   // atom identifying character string
    LPTSTR lpBuffer,   // address of buffer for atom string  
    int nSize    // size of buffer
   );   
 

Parameters

nAtom

Specifies the local atom that identifies the character string to be retrieved.

lpBuffer

Points to the buffer for the character string.

nSize

Specifies the size, in characters, of the buffer.

 

Return Values

If the function succeeds, the return value is the length of the string copied to the buffer, in characters, not including the terminating null character.
If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks

The string returned for an integer atom (an atom created by the MAKEINTATOM macro) is a null-terminated string in which the first character is a pound sign (#) and the remaining characters represent the unsigned integer originally passed to MAKEINTATOM.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 22-10-2004 17:23 » 

вот, нашёл я примерчик Улыбаюсь вот тут
http://pascal.sources.ru/cgi-bin/forum/YaBB.cgi?board=cpp;action=display;num=1026813179

некто alexey_ma приводит пример нахождения ID процесса по названию , собственно, модуля...

вот моя переделка под VC++ с минимальнейшими изменениями:

Код:
#include "TLHELP32.h"

bool CGuard2View::GetProcessByExeName(DWORD* Pid,CString ExeName)
{
ExeName.MakeUpper();
HANDLE hProcessSnap=NULL;
PROCESSENTRY32 pe32=|0";
CString temp="";
hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPALL,NULL);
if(hProcessSnap == (void*)-1)
{
::AfxMessageBox(" Snapshot failed");
return false;
}
pe32.dwSize=sizeof(PROCESSENTRY32);
if(Process32First(hProcessSnap,&pe32))temp=pe32.szExeFile;
temp.MakeUpper();
if(temp.Find(ExeName)!=-1)
{
*Pid=pe32.th32ProcessID;
CloseHandle (hProcessSnap);
return true;
}
pe32.dwSize=sizeof(PROCESSENTRY32);
while(Process32Next(hProcessSnap,&pe32))
{
temp=pe32.szExeFile;
temp.MakeUpper();
if(temp.Find(ExeName)!=-1)
{
*Pid= pe32.th32ProcessID;
CloseHandle (hProcessSnap);
return true;
}
pe32.dwSize=sizeof(PROCESSENTRY32);
}
CloseHandle (hProcessSnap);
*Pid=0;
return false;
}

собственно в моём случае меня интересовает только bool, то есть при успешном поиске - true.

вот это:
   ExeName.MakeUpper();
для того, что вот здесь
if(Process32First(hProcessSnap,&pe32))temp=pe32.szExeFile;
получаем имя очередного процесса, и  ОНО - в верхнем регистре, поэтому и сравниваем всё в верхнем

причём в pe32.szExeFile будет строка вроде
"C:\\PROGRAM FILES\\FIREBIRD\\FIREBIRD_1_5\\BIN\\FBGUARD.EXE", поэтому
можно на вход процедуре подать прямо путь к файлу - с именем файла (если нужно, конечно)

----------------------
и ещё alexey_ma делает такое замечание:
 "Для Win9x и 2000. (Для NT по другому)"


Отсюда вытекает вопрос: как проге узнать какая винда и как сделать сделанное выше под NT ?
« Последнее редактирование: 02-12-2007 15:14 от Алексей1153++ » Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 22-10-2004 18:21 » 

Вот Функция описываюшая виндовс. Хеадер winbase.h
Цитата
The GetVersionEx function obtains extended information about the version of the operating system that is currently running.

BOOL GetVersionEx(

    LPOSVERSIONINFO lpVersionInformation    // pointer to version information structure
   );   
 

Parameters

lpVersionInformation

Pointer to an OSVERSIONINFO data structure that the function fills with operating system version information.
Before calling the GetVersionEx function, set the dwOSVersionInfoSize member of the OSVERSIONINFO data structure to sizeof(OSVERSIONINFO).

 

Return Values

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError. The function fails if you specify an invalid value for the dwOSVersionInfoSize member of the OSVERSIONINFO structure.

Remarks

The GetVersionEx function supersedes the GetVersion function and is the preferred method for obtaining operating system version number information. New applications should use the GetVersionEx function rather than the GetVersion function.


Цитата
The OSVERSIONINFO data structure contains operating system version information. The information includes major and minor version numbers, a build number, a platform identifier, and descriptive text about the operating system. This structure is used with the GetVersionEx function.

typedef struct _OSVERSIONINFO{  
    DWORD dwOSVersionInfoSize;
    DWORD dwMajorVersion;
    DWORD dwMinorVersion;
    DWORD dwBuildNumber;
    DWORD dwPlatformId;
    TCHAR szCSDVersion[ 128 ];
} OSVERSIONINFO;
 

Members

dwOSVersionInfoSize

Specifies the size, in bytes, of this data structure. Set this member to sizeof(OSVERSIONINFO) before calling the GetVersionEx function.

dwMajorVersion

Identifies the major version number of the operating system. For example, for Windows NT version 3.51, the major version number is 3; and for Windows NT version 4.0, the major version number is 4.

dwMinorVersion

Identifies the minor version number of the operating system. For example, for Windows NT version 3.51, the minor version number is 51; and for Windows NT version 4.0, the minor version number is 0.

dwBuildNumber

Windows NT: Identifies the build number of the operating system.
Windows 95: Identifies the build number of the operating system in the low-order word. The high-order word contains the major and minor version numbers.

dwPlatformId

Identifies the operating system platform. This member can be one of the following values:

Value   Platform
VER_PLATFORM_WIN32s   Win32s on Windows 3.1.
VER_PLATFORM_WIN32_WINDOWS   Win32 on Windows 95.
VER_PLATFORM_WIN32_NT   Win32 on Windows NT.
 

szCSDVersion

Windows NT: Contains a null-terminated string, such as "Service Pack 3", that indicates the latest Service Pack installed on the system. If no Service Pack has been installed, the string is empty.
Windows 95: Contains a null-terminated string that provides arbitrary additional information about the operating system.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 22-10-2004 18:33 » new

Finch, спасибо  8)

правда NT сейчас под рукой нет - как попробую напишу.

А может кто , у кого NT прокатает примерчик у себя и напишет тут? А ?
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines