指定したアプリケーションが起動しているか調べる。
+OSがWin95系かNT系か判断する。
アプリケーションのパスからそのアプリが起動しているか調べられます。
ただしこれはWin95系とNT系では調べ方が違います。
起動しているか調べる関数。(95系) |
#include <tlhelp32.h> // 追加する
#pragma comment(lib, "th32.lib") // 追加する
BOOL fCheckExistProcess95(LPCTSTR pszExeName)
{
PROCESSENTRY32 pe32 = {0};
BOOL fOK;
BOOL fFind = FALSE;
HANDLE hSnapshot = ::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS,0 );
if( !hSnapshot ) return FALSE;
pe32.dwSize = sizeof( pe32 );
if( !::Process32First(hSnapshot,&pe32) ){
return FALSE;
}
do{
if( 0 == lstrcmpi(pe32.szExeFile,pszExeName) ){
fFind = TRUE;
continue;
}
fOK = ::Process32Next(hSnapshot,&pe32);
} while( fOK && (!fFind) );
::CloseHandle( hSnapshot );
return fFind;
}
|
|
|
// lpCommandLineは調べたいアプリのフルパスを設定する。
char lpCommandLine[]=_T("C:\\WINDOWS\\NOTEPAD.EXE");
if (fCheckExistProcess95(lpCommandLine) == TURE)
{
// 戻り値がTRUEなら起動している。
AfxMessageBox(_T("起動しています。"));
}
else (fCheckExistProcess95(lpCommandLine) == FALSE)
{
// 戻り値がFALSEなら起動していない。
AfxMessageBox(_T("起動していません。"));
}
|
|
|
#include <winperf.h> // 追加する
BOOL fCheckExistProcessNT(LPCTSTR pszExeName)
{
const LPTSTR c_szRegKeyPerf =
_T("software\\microsoft\\windows nt\\currentversion\\perflib");
const LPTSTR c_szRegSubkeyCounters = _T("Counters");// COUNTERサブキー
const LPTSTR c_szProcessCounter = _T("process");
const LPTSTR c_szProcessIdCounter = _T("id process");
const DWORD c_dwInitialSize = 51200L;
const DWORD c_szExtendSize = 25600L;
DWORD dwNumTasks;// 最大タスク数
HKEY hKeyNames;
CString cstrKey,cstrSubKey;
LANGID lid;
LPBYTE p;
LPBYTE p2;
DWORD dwProcessIdTitle;
DWORD dwSize,dwType;
PPERF_DATA_BLOCK pPerf;
PPERF_OBJECT_TYPE pObj;
PPERF_INSTANCE_DEFINITION pInst;
PPERF_COUNTER_BLOCK pCounter;
PPERF_COUNTER_DEFINITION pCounterDef;
DWORD i;
DWORD dwProcessIdCounter;
LPBYTE buf = NULL;
CString cstrProcessName;
DWORD dwValueSize;
long lRet;
int iRet;
BOOL fOK = FALSE;
// 日本語
lid = MAKELANGID( LANG_JAPANESE, SUBLANG_NEUTRAL );
cstrKey.Format( _T("%s\\%03x"), c_szRegKeyPerf, lid );
if( ERROR_SUCCESS != ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,cstrKey,
0,KEY_READ,&hKeyNames ) )
{
goto exit;
}
// get the buffer size for the counter names
if( ERROR_SUCCESS != ::RegQueryValueEx(hKeyNames,c_szRegSubkeyCounters,
NULL,&dwType,NULL,&dwSize) )
{
goto exit;
}
// allocate the counter names buffer
buf = new BYTE [dwSize];
if( buf == NULL ){
goto exit;
}
memset( buf, 0, dwSize );
// read the counter names from the registry
if( ERROR_SUCCESS != ::RegQueryValueEx(hKeyNames,c_szRegSubkeyCounters,
NULL,&dwType,buf,&dwSize) )
{
goto exit;
}
p = buf;
while( *p ){
if( p > buf ){
for( p2=p-2 ; isdigit(*p2) ; p2-- ) ;
}
if( ::lstrcmpi((LPSTR)p, c_szProcessCounter) == 0 ){
// look backwards for the counter number
for( p2=p-2 ; isdigit(*p2) ; p2-- ) ;
cstrSubKey = p2+1;
}
else if( ::lstrcmpi((LPSTR)p, c_szProcessIdCounter) == 0 ){
// look backwards for the counter number
for( p2=p-2 ; isdigit(*p2) ; p2-- ) ;
dwProcessIdTitle = atol( (LPSTR)(p2+1) );
}
// next string
p += (lstrlen((LPSTR)p) + 1);
}
// free the counter names buffer
if( buf ){
delete [] buf;
}
// allocate the initial buffer for the performance data
dwSize = c_dwInitialSize;
buf = new BYTE[dwSize];
if( buf == NULL ){
goto exit;
}
memset( buf, 0, dwSize );
while( TRUE ){
dwValueSize = dwSize;
lRet = ::RegQueryValueEx(HKEY_PERFORMANCE_DATA,
cstrSubKey.GetBuffer(128), NULL, NULL,
buf, &dwValueSize);
cstrSubKey.ReleaseBuffer();
pPerf = (PPERF_DATA_BLOCK) buf;
// perfデータプロックのシグニチャチェック
if( (lRet == ERROR_SUCCESS) &&
(dwSize > 0) &&
(pPerf)->Signature[0] == (WCHAR)'P' &&
(pPerf)->Signature[1] == (WCHAR)'E' &&
(pPerf)->Signature[2] == (WCHAR)'R' &&
(pPerf)->Signature[3] == (WCHAR)'F' ) {
break;
}
// 領域の拡大
if( lRet == ERROR_MORE_DATA ){
dwSize += c_szExtendSize;
delete [] buf;
buf = new BYTE[dwSize];
if( buf == NULL ){
goto exit;
}
memset( buf, 0, dwSize );
}
else {
goto exit;
}
}
// perf_object_type ポインタセット
pObj = (PPERF_OBJECT_TYPE) ((DWORD)pPerf + pPerf->HeaderLength);
// loop thru the performance counter definition records looking
// for the process id counter and then save its offset
pCounterDef = (PPERF_COUNTER_DEFINITION) ((DWORD)pObj + pObj->HeaderLength);
for (i=0; i<(DWORD)pObj->NumCounters; i++) {
if (pCounterDef->CounterNameTitleIndex == dwProcessIdTitle) {
dwProcessIdCounter = pCounterDef->CounterOffset;
break;
}
pCounterDef++;
}
dwNumTasks = (DWORD)pObj->NumInstances;
pInst = (PPERF_INSTANCE_DEFINITION) ((DWORD)pObj + pObj->DefinitionLength);
// パフォーマンスインスタンスデータよりプロセス名サーチ
for( i=0 ; i<dwNumTasks ; i++ ){
// プロセス名へのポインタ
p = (LPBYTE) ((DWORD)pInst + pInst->NameOffset);
cstrProcessName.Empty();
if( !::IsBadStringPtr((LPSTR)p, MAX_PATH) ){
// Unicode から asciiに変換
iRet = ::WideCharToMultiByte( CP_ACP,
0,
(LPCWSTR)p,
-1,
cstrProcessName.GetBuffer(MAX_PATH),
MAX_PATH,
NULL,
NULL );
cstrProcessName.ReleaseBuffer();
cstrProcessName += _T(".exe");
if( iRet > 0 ){
CString cstrName;
LPSTR pszFilePart;
::GetFullPathName(pszExeName, MAX_PATH,
cstrName.GetBuffer(MAX_PATH), &pszFilePart);
cstrName.ReleaseBuffer();
cstrName = pszFilePart;
if( 0 == cstrProcessName.CompareNoCase(cstrName) ){
fOK = TRUE;
break;
}
}
}
pCounter = (PPERF_COUNTER_BLOCK) ((DWORD)pInst + pInst->ByteLength);
// next process
pInst = (PPERF_INSTANCE_DEFINITION) ((DWORD)pCounter + pCounter->ByteLength);
}
exit:
::RegCloseKey( hKeyNames );
::RegCloseKey( HKEY_PERFORMANCE_DATA );
if( buf ){
delete [] buf;
}
return fOK;
}
|
|
|
// lpCommandLineは調べたいアプリのフルパスを設定する。
char lpCommandLine[]=_T("C:\\WINDOWS\\NOTEPAD.EXE");
if (fCheckExistProcessNT(lpCommandLine) == TURE) // ここが違うだけ
{
// 戻り値がTRUEなら起動している。
AfxMessageBox(_T("起動しています。"));
}
else if (fCheckExistProcess95(lpCommandLine) == FALSE)
{
// 戻り値がFALSEなら起動していない。
AfxMessageBox(_T("起動していません。"));
}
|
|
|
// 95系かNT系かを調べる。
OSVERSIONINFO osInfo;
osInfo.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
GetVersionEx( &osInfo );
int i;
char lpCommandLine[] = _T("C:\\WINDOWS\\NOTEPAD.EXE");
if( osInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ) // 95系の場合
i = fCheckExistProcess95(lpCommandLine);
else if ( osInfo.dwPlatformId == VER_PLATFORM_WIN32_NT ) // NTの場合
i = fCheckExistProcessNT(lpCommandLine);
// 状態の表示
if (i == TRUE)
AfxMessageBox(_T("起動しています。"));
else if (i == FALSE)
AfxMessageBox(_T("起動していません。"));
|
[ 戻る ]