に記載されている問題は、あなたがProcess32First()
/Process32Next()
のTCHAR
のバージョンを使用していることで、あなたのデバッガscrenshotは明らかにそう、あなたがUnicodeのプロジェクトをコンパイルしていることを示していますTCHAR
はWCHAR
にマップし、従ってprocess.szExeFile
はWCHAR[]
アレイです。その配列をchar*
ポインターに誤って型変換しています。 Unicode文字列とAnsi文字列を直接比較することはできません。ある文字列を他の文字列のエンコーディングに変換してから比較する必要があります。
さらにHANDLE
がリークしています(CreateToolhelp32Snapshot()
)。
あなたGetProcessValues()
関数への入力などのANSI std::string
を渡しているので、最も簡単な解決策ではなく、Process32First()
/Process32Next()
ののAnsiバージョンを使用することですので、process.szExeFile
は今CHAR[]
配列、したがって、変換なしで必要とされている:
HANDLE GetProcessValues(std::string ProcName)
{
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (snapshot == INVALID_HANDLE_VALUE)
return NULL;
PROCESSENTRY32A process;
ZeroMemory(&process, sizeof(process));
process.dwSize = sizeof(process);
const char* ProcNameChar = ProcName.c_str();
HANDLE hProc = NULL;
if (Process32FirstA(snapshot, &process))
{
do
{
if (_stricmp(process.szExeFile, ProcNameChar) == 0)
{
hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, process.th32ProcessID);
break;
}
}
while (Process32NextA(snapshot, &process));
}
CloseHandle(snapshot);
return hProc;
}
しかし、あなたは本当にはAnsi APIを使用してから離れて滞在する必要があります。 WindowsはUnicodeベースのOSであり、長い間続いてきました。代わりにユニコード APIを使用します。
HANDLE GetProcessValues(std::wstring ProcName)
{
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (snapshot == INVALID_HANDLE_VALUE)
return NULL;
PROCESSENTRY32W process;
ZeroMemory(&process, sizeof(process));
process.dwSize = sizeof(process);
const wchar_t* ProcNameChar = ProcName.c_str();
HANDLE hProc = NULL;
if (Process32FirstW(snapshot, &process))
{
do
{
if (_wcsicmp(process.szExeFile, ProcNameChar) == 0)
{
hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, process.th32ProcessID);
break;
}
}
while (Process32NextW(snapshot, &process));
}
CloseHandle(snapshot);
return hProc;
}
あなたProcName
パラメータは、絶対に、あなたはどちらかができ、std::string
でなければならない場合:
はなど、MultiByteToWideChar()
、std::wstring_convert
を使用してUnicodeにProcName
を変換し、比較その結果、Unicode APIによって返される文字列になります。
WideCharToMultiByte()
,std::wstring_convert
などを使用してUnicode APIからAnsiに文字列を変換し、その結果をProcName
と比較してください。
画像から 'process.szExeFile'はwchar * not char *です。 – drescherjm
なぜ '_stricmp'の最初の引数で' char * 'にキャストしましたか?コンパイラが型の不一致エラーについてシャットダウンする場合は、それをやめ、正しい文字列型を関数に渡します。文字列型をキャストしない - キャストは**変換ではありません**。 – PaulMcKenzie
あなたはコンパイラに嘘をついて、ちょうどデザートを手に入れました –