特定のアプリが起動中かどうか調べるには?

解決


boo  2006-10-10 06:54:51  No: 63259

すいません。ご教授ください。
過去のスレッドの実績あるプログラムを私の環境下で動作させようとしています。しかし、エラーが取れず行き詰っております。宜しくお願いいたします。

環境:VC++.net 2002
OS:WindowsXP

#include <psapi.h>
#pragma comment(lib,"Psapi.Lib")

BOOL CMyClass::GetExeProcess(const CString &exename)
{
    HANDLE hSnapShot; //スナップショット
    PROCESSENTRY32 pEntry; //プロセスエントリ
    CString buf;

    //システムのスナップショットを取得
    hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
    //プロセスントリの前処理(Process32Firstを呼ぶために必要)
    pEntry.dwSize =sizeof(pEntry);
    //最初のプロセスの取得(Process32Nextを呼ぶために必要)
    Process32First (hSnapShot,&pEntry); 

    while(1){
        //プロセスの取得
        BOOL hRes = Process32Next (hSnapShot,&pEntry);

        // プロセスが取得できなかったらLoopを抜ける
        if(hRes == FALSE)return FALSE;

        //Exeファイル名
        buf = pEntry.szExeFile;
        if( exename == buf )return TRUE;
    }
}


boo  2006-10-10 07:18:59  No: 63260

追記です。
エラー内容は柿になります。プログラム上記部分でリンクしているのですが、できてないと考えております。よろしくお願いいたします。

c:\Documents and Settings\Owner\My Documents\Visual Studio Projects\実験んん\MyClass.cpp(15): error C2065: 'PROCESSENTRY32' : 定義されていない識別子です。
c:\Documents and Settings\Owner\My Documents\Visual Studio Projects\実験んん\MyClass.cpp(19): error C2065: 'CreateToolhelp32Snapshot' : 定義されていない識別子です。
c:\Documents and Settings\Owner\My Documents\Visual Studio Projects\実験んん\MyClass.cpp(19): error C2065: 'TH32CS_SNAPALL' : 定義されていない識別子です。
c:\Documents and Settings\Owner\My Documents\Visual Studio Projects\実験んん\MyClass.cpp(23): error C2065: 'Process32First' : 定義されていない識別子です。
c:\Documents and Settings\Owner\My Documents\Visual Studio Projects\実験んん\MyClass.cpp(27): error C2065: 'Process32Next' : 定義されていない識別子です。


επιστημη  2006-10-10 07:38:12  No: 63261

> プログラム上記部分でリンクしているのですが、できてないと考えております。

リンクはおろか、コンパイルさえできてません。

#include <tlhelp32.h>
を追加してみて。

ところで、マニュアル読みましたか?


boo  2006-11-12 03:03:18  No: 63262

時間がすごく空いてしまいました。
コンパイルエラーをとるのに時間がかかってしまいました。

リンクの問題についてネットで調べましたが解決方法が見つからないの
ですがどうしたらよろしいでしょうか。

#include "stdafx.h"
#include "実験んん.h"
#include <windows.h>
#include "psapi.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// 唯一のアプリケーション オブジェクトです。

CWinApp theApp;
using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{

  int nRetCode = 0;

  // MFC を初期化して、エラーの場合は結果を印刷します。
  if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
  {
    // TODO: 必要に応じてエラー コードを変更してください。
    _tprintf(_T("致命的なエラー : MFC の初期化ができませんでした。\n"));
    nRetCode = 1;
  }
  else
  {
    // TODO: アプリケーションの動作を記述するコードをここに挿入してください。
    DWORD ProcessArray[1024];
    DWORD Needed;
    DWORD ProcessNum;
    char szProcessName[MAX_PATH] = "unknown";
  
    // PSAPI.DLL ライブラリをロード
    HINSTANCE hInstLib = LoadLibrary("PSAPI.DLL");
    if ( hInstLib == NULL )
    {
        return FALSE ;
    }

    if(! ::EnumProcesses(ProcessArray, sizeof(ProcessArray), &Needed) )
    {
        return 0;
    }

    ProcessNum = Needed / sizeof(DWORD);
    for(int i = 0; i < ProcessNum; ++i) {
        HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION 
                                       | PROCESS_VM_READ,
                                       FALSE, 
                                       ProcessArray[i]);
       if (NULL != hProcess )
       {
           HMODULE hMod;
           DWORD cbNeeded;

           if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
           {
               GetModuleFileNameEx( hProcess, hMod, szProcessName,sizeof(szProcessName) );
           }
           else continue;
       }
       else continue;

       printf( "%s (Process ID: %u)\n", szProcessName, ProcessArray[i] );
       CloseHandle( hProcess );
    }

    getchar();
    return 0;
  }
}

コンパイル結果
c:\Documents and Settings\Owner\My Documents\Visual Studio Projects\実験んん\実験んん.cpp(50): warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
実験んん error LNK2019: 未解決の外部シンボル _GetModuleFileNameExA@16 が関数 _main で参照されました。
実験んん error LNK2019: 未解決の外部シンボル _EnumProcessModules@16 が関数 _main で参照されました。
実験んん error LNK2019: 未解決の外部シンボル _EnumProcesses@12 が関数 _main で参照されました。
実験んん fatal error LNK1120: 外部参照 3 が未解決です。


kure  2006-11-12 07:40:37  No: 63263

ダイナミックリンクとスタティックリンクが区別できてませんね。

コンパイル結果は、
スタティックリンクしようとしてるんだけど
リンク指定されてるStaticLinkLibrary(*.libファイル)
の中にシンボルが見つからないってエラーです。
つまり、GetModuleFileNameExやらEnumProcessModulesの
シンボルがあるlibをリンクするようにプロジェクトの設定を
変更してください。

きちんとスタティックリンクできればLoadLibraryは必要ありません。

# というか最初のコードにpragmaがあるんだけど。
# 全然違うコード載せられてわからんわからん言われても
# 前後関係がわからんから答えづらくてしょうがない。


boo  2006-11-13 05:25:03  No: 63264

kureさんありがとうございます。
どうしてもバグがとれないため試行錯誤した結果、今のコードになりました。

Psapi.Libをリンクしコンパイルした結果、
cPsapi.Lib(2): error C2018: 文字 '0x60' は認識できません。Unicode 識別子はサポートされていません。

このエラーは、大文字が入ってる警告だと思いますが、
どうすれば解決できますか。
すいません、よろしくお願いいたします。


瀬戸っぷ  2006-11-13 08:34:15  No: 63265

> Psapi.Libをリンクしコンパイルした結果、
> cPsapi.Lib(2): error C2018: 文字 '0x60' は認識できません。Unicode 識別子はサポートされていません。

本当にこんなエラーコードですか?
Psapi.Libはドコに書きましたか?

# 関係ないとは思いますが…
# 日本語ファイル名や日本語ディレクトリ名とかは避けておいた方が無難かと思われますが。


PATIO  2006-11-13 19:40:19  No: 63266

用語をおかしな使い方をしているのでちゃんと理解して使った方がいいです。
コンパイル、リンク、ビルドこれらがそれぞれどういう意味なのかと言うことを
きちんと理解して使わないと話が繋がりません。

関数の使用するときにインクルードする必要があるヘッダーファイルは
HELP(MSDN)で関数を調べれば、その中に書いてあります。
リンクすべきファイルの名前も確かあったはずです。

あと、LoadLibraryして使いたいのか、リンク時にリンクしておいて使いたいのか
どっちなんでしょう?
やりたい事をきちんと説明しないと伝わりませんよ。


boo  2006-11-18 23:41:11  No: 63267

すいません。エラーやLnkがうまくいかずテンパってました。

PSAPI.DLLで設定されている関数を使用できるようにリンクの設定を
見直したところ無事動きました。

コメントいただいたみなさん、ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加