进程名称的比较

时间:2013-08-14 05:55:20

标签: c++ winapi winsock

我编写过滤系统并使用Winsock2 LSP。 在WSPConnect中,我需要将进程的可执行文件名与harcoded Unicode String进行比较。 我这样做:

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

LPWSTR mn = L"redirect.exe";
if (lstrcmp (moduleName, mn) == 0){ ...some code there...}

我做错了什么?

2 个答案:

答案 0 :(得分:2)

  1. 您应该比较“不区分大小写”:lstrcmpi

  2. 您需要传递正确的字符数组...

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

  4. 如果您明确使用GetModuleFileNameEx =&gt;,则不应使用wchar_t的TCHAR版本。 GetModuleFileNameExW <!/ p>

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

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

  7. 还要确保您的字符串正确终止NUL!

  8. 此外,您必须知道返回的路径可能包含完整路径,因此与流程名称的比较永远不会匹配...

  9. 此外,您必须知道路径可能会缩写短文件名! (不是在你的情况下,因为名称不超过8个字符;但如果你将它与“MyExecutable.exe”进行比较,你还必须与短文件名进行比较;参见GetShortPathName

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

    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...}
      }
    }
    

答案 1 :(得分:1)

你需要声明存储空间,只需指针就不够了

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

应该是

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

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