すいません。ご教授ください。
過去のスレッドの実績あるプログラムを私の環境下で動作させようとしています。しかし、エラーが取れず行き詰っております。宜しくお願いいたします。
環境: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;
}
}
追記です。
エラー内容は柿になります。プログラム上記部分でリンクしているのですが、できてないと考えております。よろしくお願いいたします。
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' : 定義されていない識別子です。
> プログラム上記部分でリンクしているのですが、できてないと考えております。
リンクはおろか、コンパイルさえできてません。
#include <tlhelp32.h>
を追加してみて。
ところで、マニュアル読みましたか?
時間がすごく空いてしまいました。
コンパイルエラーをとるのに時間がかかってしまいました。
リンクの問題についてネットで調べましたが解決方法が見つからないの
ですがどうしたらよろしいでしょうか。
#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 が未解決です。
ダイナミックリンクとスタティックリンクが区別できてませんね。
コンパイル結果は、
スタティックリンクしようとしてるんだけど
リンク指定されてるStaticLinkLibrary(*.libファイル)
の中にシンボルが見つからないってエラーです。
つまり、GetModuleFileNameExやらEnumProcessModulesの
シンボルがあるlibをリンクするようにプロジェクトの設定を
変更してください。
きちんとスタティックリンクできればLoadLibraryは必要ありません。
# というか最初のコードにpragmaがあるんだけど。
# 全然違うコード載せられてわからんわからん言われても
# 前後関係がわからんから答えづらくてしょうがない。
kureさんありがとうございます。
どうしてもバグがとれないため試行錯誤した結果、今のコードになりました。
Psapi.Libをリンクしコンパイルした結果、
cPsapi.Lib(2): error C2018: 文字 '0x60' は認識できません。Unicode 識別子はサポートされていません。
このエラーは、大文字が入ってる警告だと思いますが、
どうすれば解決できますか。
すいません、よろしくお願いいたします。
> Psapi.Libをリンクしコンパイルした結果、
> cPsapi.Lib(2): error C2018: 文字 '0x60' は認識できません。Unicode 識別子はサポートされていません。
本当にこんなエラーコードですか?
Psapi.Libはドコに書きましたか?
# 関係ないとは思いますが…
# 日本語ファイル名や日本語ディレクトリ名とかは避けておいた方が無難かと思われますが。
用語をおかしな使い方をしているのでちゃんと理解して使った方がいいです。
コンパイル、リンク、ビルドこれらがそれぞれどういう意味なのかと言うことを
きちんと理解して使わないと話が繋がりません。
関数の使用するときにインクルードする必要があるヘッダーファイルは
HELP(MSDN)で関数を調べれば、その中に書いてあります。
リンクすべきファイルの名前も確かあったはずです。
あと、LoadLibraryして使いたいのか、リンク時にリンクしておいて使いたいのか
どっちなんでしょう?
やりたい事をきちんと説明しないと伝わりませんよ。
すいません。エラーやLnkがうまくいかずテンパってました。
PSAPI.DLLで設定されている関数を使用できるようにリンクの設定を
見直したところ無事動きました。
コメントいただいたみなさん、ありがとうございました。
ツイート | ![]() |