C++ 进程名称的比较

C++ 进程名称的比较,c++,winapi,winsock,C++,Winapi,Winsock,我编写过滤系统并使用Winsock2 LSP。 在WSPConnect中,我需要将进程的可执行文件名与已编码的Unicode字符串进行比较。 我有: 我做错了什么 您应该比较“不区分大小写”: 您需要传递一个正确的字符数组 此外,您应该始终检查函数调用的结果值 此外,如果您明确使用wchar\u t=>GetModuleFileNameExW,则不应使用TCHAR版本的GetModuleFileNameEx 如果您想获取当前进程的名称,也应该使用该方法!这更可靠 另外,您应该使用MAX_PATH

我编写过滤系统并使用
Winsock2 LSP
。 在
WSPConnect
中,我需要将进程的可执行文件名与已编码的Unicode字符串进行比较。 我有:

我做错了什么

  • 您应该比较“不区分大小写”:

  • 您需要传递一个正确的字符数组

  • 此外,您应该始终检查函数调用的结果值

  • 此外,如果您明确使用
    wchar\u t
    =>
    GetModuleFileNameExW
    ,则不应使用TCHAR版本的
    GetModuleFileNameEx

  • 如果您想获取当前进程的名称,也应该使用该方法!这更可靠

  • 另外,您应该使用MAX_PATH而不是_MAX_FNAME,因为该方法也可能返回完整路径

  • 还要确保字符串正确地以NUL结尾

  • 您还必须知道,返回的路径可能包含完整路径,因此与进程名称的比较永远不匹配

  • 您还必须注意,路径可能包含短文件名!(不适用于您的情况,因为名称不超过8个字符;但如果将其与“MyExecutable.exe”进行比较,则还必须与短文件名进行比较;请参阅

  • 代码部分现在应该如下所示:

    WCHAR moduleName[MAX_PATH+1];
    if (GetModuleFileNameW (NULL, moduleName, MAX_PATH) != 0)
    {
      moduleName[MAX_PATH] = 0;
      LPWSTR mn = L"redirect.exe";
      int len = lstrlen(moduleName);
      int lenmn = lstrlen(mn);
      if (len > lenmn)
      {
        if (lstrcmpi (&moduleName[len-lenmn], mn) == 0){ ...some code there...}
      }
    }
    
  • 您应该比较“不区分大小写”:

  • 您需要传递一个正确的字符数组

  • 此外,您应该始终检查函数调用的结果值

  • 此外,如果您明确使用
    wchar\u t
    =>
    GetModuleFileNameExW
    ,则不应使用TCHAR版本的
    GetModuleFileNameEx

  • 如果你想得到当前进程的名称,你也应该使用这个方法!这样更可靠

  • 另外,您应该使用MAX_PATH而不是_MAX_FNAME,因为该方法也可能返回完整路径

  • 还要确保字符串正确地以NUL结尾

  • 您还必须知道,返回的路径可能包含完整路径,因此与进程名称的比较永远不匹配

  • 您还必须注意,路径可能包含短文件名!(在您的情况下不是这样,因为名称不超过8个字符;但是如果您将其与“MyExecutable.exe”进行比较,您还必须与短文件名进行比较;请参阅

  • 代码部分现在应该如下所示:

    WCHAR moduleName[MAX_PATH+1];
    if (GetModuleFileNameW (NULL, moduleName, MAX_PATH) != 0)
    {
      moduleName[MAX_PATH] = 0;
      LPWSTR mn = L"redirect.exe";
      int len = lstrlen(moduleName);
      int lenmn = lstrlen(mn);
      if (len > lenmn)
      {
        if (lstrcmpi (&moduleName[len-lenmn], mn) == 0){ ...some code there...}
      }
    }
    

    您需要声明存储空间,仅仅一个指针是不够的

    LPWSTR moduleName = {0};
    GetModuleFileNameEx (GetCurrentProcess(),0,moduleName,_MAX_FNAME );
    
    应该是

    TCHAR moduleName[_MAX_PATH];
    GetModuleFileNameEx(GetCurrentProcess(), 0, moduleName, _countof(moduleName));
    

    并且使用不区分大小写的lstrcmpi()

    您需要声明存储空间,仅仅一个指针是不够的

    LPWSTR moduleName = {0};
    GetModuleFileNameEx (GetCurrentProcess(),0,moduleName,_MAX_FNAME );
    
    应该是

    TCHAR moduleName[_MAX_PATH];
    GetModuleFileNameEx(GetCurrentProcess(), 0, moduleName, _countof(moduleName));
    

    使用不区分大小写的
    lstrcmpi()

    出了什么问题?得到了什么结果?
    TCHAR
    WCHAR
    冲突?@rajraj,我猜第2行是空指针访问。出了什么问题?得到了什么结果?
    TCHAR
    WCHAR
    冲突?@rajraj,我猜第2行是空指针访问。