2017-02-08 11 views
0

何らかの理由で、私のC++ clrコンソールアプリケーションでcファイルをコンパイルできなくなりました。以前はclrのサポートなしで動作していましたが、/ TPがまだ動作していないため、プロジェクトをコンパイルするように切り替えました。どんな助けでも大歓迎です。CファイルをC++でコンパイルできませんVisual Studio

エラー

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; 
} 
+7

エラーメッセージは、何が間違っているかを正確に示しています。 'strcmp'は' char * 'をとり、' wchar_t * 'を与えています。おそらく['wcscmp'](https://msdn.microsoft.com/en-us/library/e0z9k731.aspx)は' strcmp'と基本的に同じですが、 'wchar_t * 'で動作する点が異なります。 – nwp

答えて

3

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関数では、ANSI/ASCIIを必要に応じてANSI/ASCIIをUnicodeに変換し、Windows NTおよび古いAPI関数ではANSI/ASCIIを使用するため、APIは内部的にUnicodeを使用します。

しかし、多くの場合、またはほとんどのテキストファイル(ソースコードなど)はANSI/ASCIIであり、Unicodeではないため、Unicode for Windows APIをサポートする必要があり、ANSI/ASCIIを同じプログラム内でサポートする必要があります。これらのプロジェクトではANSI/ASCIIを使用します。

TCHARベースのジェネリック型を使用することで、Unicodeを使用するプロジェクトとANSI/ASCIIを使用するプロジェクトで共通のコードを共有できます。

+0

あなたはASCIIではなくANSIを意味します。ANSIは、プログラム、ユーザー、またはOSから来るスレッドの文字エンコーディングを意味します。 ASCIIである可能性は非常に低いです。 –

+0

@TomBlodget - 両方を表示するように私の答えを更新しました。 [MSDN ASCII](http://msdn.microsoft.com/en-us/library/hx3yt8af.aspx)を参照してください。 – rcgldr

0

szExeFiletagPROCESSENTRY32は、文字セットを 'Not Set'または 'Multibyte'に設定してコンパイルすると、1バイトのcharとなるTCHARと宣言されます。プロジェクト設定の文字セットをに設定します。Unicode文字セットを使用して問題を解決します。

さらに、wcscmpを使用してWCHARタイプを比較してください。

2

エラーメッセージは明確である:strcmpしかしWCHAR*種類によって期待どおりの引数はchar*タイプではないので

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

:あなたはこの正確な行でエラーが発生しています。代わりにwcscmpを使用してください。これは基本的に同じ機能ですが、wchar_t*タイプで動作します。

+0

ありがとうございました@Aracthor – sNOWsYSTEM

関連する問題