由于某种原因,我无法再在c ++ clr控制台应用程序中编译c文件。它没有clr支持之前工作,我也改变我的项目编译为/ TP仍然无法正常工作。任何帮助将不胜感激。
Severity Code Description Project File Line Suppression State
Error C2664 'int strcmp(const char *,const char *)': cannot convert argument 1 from 'WCHAR [260]' to 'const char *'
#include "snowkill.h"
void killProcessByName(WCHAR *filename)
{
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
PROCESSENTRY32 pEntry;
pEntry.dwSize = sizeof(pEntry);
BOOL hRes = Process32First(hSnapShot, &pEntry);
while (hRes)
{
if (strcmp(pEntry.szExeFile, filename) == 0)
{
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0,
(DWORD)pEntry.th32ProcessID);
if (hProcess != NULL && pEntry.th32ProcessID != GetCurrentProcessId())
{
TerminateProcess(hProcess, 9);
CloseHandle(hProcess);
}
}
hRes = Process32Next(hSnapShot, &pEntry);
}
CloseHandle(hSnapShot);
}
#pragma once
#include "stdafx.h"
#include <windows.h>
#include <process.h>
#include <Tlhelp32.h>
#include <winbase.h>
#include <string.h>
#ifdef __cplusplus
extern "C" {
#endif
void killProcessByName(WCHAR *filename);
#ifdef __cplusplus
}
#endif
#include "stdafx.h"
#include "snowkill.h"
#include "motion.h"
#include "info.h"
#include "flushsound.h"
#include "snowserial.h"
using namespace System;
bool on() {
return true;
}
bool off() {
return false;
}
int main()
{
listenoncommport();
for (;;) {
string onoff = checkfile();
if (onoff == "1")
{
//detected();
}
else
{
WCHAR *proccc = L"firefox.exe";
killProcessByName(proccc);
//notdetected();
}
Sleep(5000);
}
return 0;
}
答案 0 :(得分:3)
您可以将WCHAR的每个实例更改为TCHAR,因此文本设置为&#34; generic&#34;,或者如前所述,将项目属性字符集更改为仅Unicode。
void killProcessByName(TCHAR *filename)
/* ... */
if (_tcscmp(pEntry.szExeFile, filename) == 0) /* replaced strcmp */
/* ... */
#include <windows.h> /* needed in order to use TEXT() macro */
/* ... */
TCHAR *proccc = TEXT("firefox.exe"); /* TEXT() is a <windows.h> macro */
如果涉及的函数不是特定于WCHAR,则在任何地方使用TCHAR类型。这将允许项目设置构建ANSI / ASCII(未设置)或Unicode。
请注意,Process32First和Process32Next使用TCHAR。
这主要用于遗留,因为Windows 2000及更高版本的API函数在内部使用Unicode,根据需要将ANSI / ASCII转换为Unicode,而Windows NT和旧API函数使用ANSI / ASCII。
然而,通常许多或大多数文本文件(例如源代码)是ANSI / ASCII而不是Unicode,并且必须支持用于Windows API的Unicode,然后用于支持文本文件的ANSI / ASCII,这是不方便的。相同的程序,对于那些我使用ANSI / ASCII的项目。
通过使用基于TCHAR的泛型类型,我可以与使用Unicode的项目和使用ANSI / ASCII的项目共享公共代码。
答案 1 :(得分:2)
错误消息很明确:您在此精确行处出错:
if (strcmp(pEntry.szExeFile, filename) == 0)
因为您的参数不是char*
类型strcmp所期望的WCHAR*
类型。您应该使用wcscmp代替,这基本上是相同的功能,但使用wchar_t*
类型。
答案 2 :(得分:0)
szExeFile
中的 tagPROCESSENTRY32
被声明为TCHAR
,当字符集设置为“未设置”时,它将是一个1字节的字符。 “多字节”。在项目设置中将字符集设置为使用Unicode字符集来解决问题。
另外,使用wcscmp
来比较WCHAR类型。