C 文件无法在 C++ 中编译 Visual Studio
C file cannot be compiled in c++ Visual Studio
出于某种原因,我无法再在我的 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 *'
snowkill.c
#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);
}
snowkill.h
#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
main.cpp
#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;
}
tagPROCESSENTRY32
中的 szExeFile
被声明为 TCHAR
,在编译时将 字符集 设置为 1 字节字符'Not Set' 或 'Multibyte'。在您的项目设置中将字符集设置为 使用 Unicode 字符集 来解决问题。
此外,使用 wcscmp
比较 WCHAR 类型。
错误信息很清楚:你在这一行有错误:
if (strcmp(pEntry.szExeFile, filename) == 0)
因为您的参数不是 strcmp but WCHAR*
types. You should use wcscmp 预期的 char*
类型,而是基本相同的函数,但使用 wchar_t*
类型。
您可以将 WCHAR 的每个实例更改为 TCHAR,因此文本设置为 "generic",或者如前所述,将项目 属性 字符集更改为仅 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,并且必须支持 Unicode for Windows API 是很尴尬的,然后ANSI/ASCII 对于同一程序中的文本文件,对于那些我使用 ANSI/ASCII.
的项目
通过使用基于 TCHAR 的泛型类型,我可以与使用 Unicode 的项目和使用 ANSI/ASCII 的项目共享公共代码。
出于某种原因,我无法再在我的 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 *'
snowkill.c
#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);
}
snowkill.h
#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
main.cpp
#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;
}
tagPROCESSENTRY32
中的 szExeFile
被声明为 TCHAR
,在编译时将 字符集 设置为 1 字节字符'Not Set' 或 'Multibyte'。在您的项目设置中将字符集设置为 使用 Unicode 字符集 来解决问题。
此外,使用 wcscmp
比较 WCHAR 类型。
错误信息很清楚:你在这一行有错误:
if (strcmp(pEntry.szExeFile, filename) == 0)
因为您的参数不是 strcmp but WCHAR*
types. You should use wcscmp 预期的 char*
类型,而是基本相同的函数,但使用 wchar_t*
类型。
您可以将 WCHAR 的每个实例更改为 TCHAR,因此文本设置为 "generic",或者如前所述,将项目 属性 字符集更改为仅 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,并且必须支持 Unicode for Windows API 是很尴尬的,然后ANSI/ASCII 对于同一程序中的文本文件,对于那些我使用 ANSI/ASCII.
的项目通过使用基于 TCHAR 的泛型类型,我可以与使用 Unicode 的项目和使用 ANSI/ASCII 的项目共享公共代码。