簡體   English   中英

無法在C ++ Visual Studio中編譯C文件

[英]C file cannot be compiled in c++ Visual Studio

由於某些原因,我不能再在c ++ clr控制台應用程序中編譯ac文件。 在沒有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;
}

您可以將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的項目共享通用代碼。

錯誤消息很清楚:您在此精確行上有錯誤:

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

因為您的參數不是strcmp期望的char*類型,而是WCHAR*類型。 您應該改用wcscmp ,該功能基本上是相同的功能,但是使用wchar_t*類型。

szExeFile中的tagPROCESSENTRY32聲明為TCHAR ,在將“ 字符集”設置為“未設置”或“多字節”的情況下進行編譯時將是一個1字節的char。 在項目設置中將“字符集”設置為“ 使用Unicode字符集”可以解決此問題。

另外,使用wcscmp比較WCHAR類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM