C 文件无法在 c++ Visual Studio 中编译

Posted

技术标签:

【中文标题】C 文件无法在 c++ Visual Studio 中编译【英文标题】:C file cannot be compiled in c++ Visual Studio 【发布时间】:2017-02-08 13:16:10 【问题描述】:

由于某种原因,我无法再在我的 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;

【问题讨论】:

错误信息告诉你到底哪里出了问题。 strcmp 接受char *,你给它一个wchar_t *。您可能想要wcscmp,它与strcmp 基本相同,除了它适用于wchar_t * 【参考方案1】:

您可以将 WCHAR 的每个实例更改为 TCHAR,以便文本设置为“通用”,或者如前所述,将项目属性字符集更改为仅 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 的项目共享通用代码。

【讨论】:

您的意思是 ANSI,而不是 ASCII。 ANSI 表示线程的字符编码,它可能来自程序、用户或操作系统。它不太可能是 ASCII。 @TomBlodget - 我更新了我的答案以显示两者。看看MSDN ASCII。【参考方案2】:

错误信息很明确:您在这一行有错误:

if (strcmp(pEntry.szExeFile, filename) == 0)

因为您的参数不是strcmp 所期望的char* 类型,而是WCHAR* 类型。您应该改用wcscmp,它基本上是相同的功能,但使用wchar_t* 类型。

【讨论】:

【参考方案3】: tagPROCESSENTRY32 中的

szExeFile 被声明为 TCHAR,当编译时将 字符集 设置为“未设置”或“多字节”,它将是一个 1 字节的字符。将项目设置中的字符集设置为使用 Unicode 字符集来解决问题。

另外,使用wcscmp 来比较 WCHAR 类型。

【讨论】:

以上是关于C 文件无法在 c++ Visual Studio 中编译的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio C++ - 无法输出预处理文件

C ++ boost nuget无法打开文件Visual Studio 2015

Visual Studio 2010 C++,无法打开包含文件:“afxwin.h”、“TCHAR.H”和“cassert”

无法使用 Visual Studio 导出 C++ dll

为啥以下无法在 Visual Studio 2010 C++ 下编译?

C ++(Visual Studio),无法将数字“10”写入文件,所有其他数字都有效吗?