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

时间:2017-02-08 13:16:11

标签: c++ c visual-studio visual-studio-2015 clr

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

3 个答案:

答案 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类型。