Hello, I have this code:

void GetProcId(char* ProcName)
	{
		PROCESSENTRY32   pe32;
		HANDLE         hSnapshot = NULL;

		pe32.dwSize = sizeof( PROCESSENTRY32 );
		hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );

		if( Process32First( hSnapshot, &pe32 ) )
		{
			do{
				if( _stricmp( pe32.szExeFile, ProcName ) == 0 )
					break;
			}while( Process32Next( hSnapshot, &pe32 ) );
		}

		if( hSnapshot != INVALID_HANDLE_VALUE )
			CloseHandle( hSnapshot );

		ProcId = pe32.th32ProcessID;
	}

But I keep getting:

argument of type "WCHAR *" is incompatible with parameter of type "const char *
'_stricmp' : cannot convert parameter 1 from 'WCHAR [260]' to 'const char *'

I dont know what to do anymore, I'm researching this kind of code for over 2h!

Edited 5 Years Ago by lelejau: n/a

You're compiling the code with unicode support. If you look at how szExeFile is declared, you'll see:

TCHAR     szExeFile[MAX_PATH];

Because you compile with unicode support, the compiler expands 'TCHAR' to 'WCHAR', which is a wide character.

So in your project settings, you should compile with 'multi-byte support', or change procname to TCHAR as well, and make sure the rest of your application is unicode.

However, if you fix this it will still give the same error. szExeFile is a fixed-length array, but the str*cmp functions take a char*.

You can do this by passing &pe32.szExeFile[0] to these functions.

Also note, it is better to use _strnicmp instead of _stricmp, as this takes a size parameter. If you decide to convert your application to unicode you need to use _wcsnicmp (this is off the top of my head, excuse me for typos).

This article has been dead for over six months. Start a new discussion instead.