0

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

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

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

我做错了什么?

4

2 回答 2

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

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

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

  4. GetModuleFileNameEx此外,如果您明确使用wchar_t=> ,则不应使用 TCHAR 版本GetModuleFileNameExW

  5. GetModuleFileNameW如果要获取当前进程的名称,也应该使用该方法!这个比较靠谱!

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

  7. 还要确保您的字符串正确以 NUL 结尾!

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

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

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

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...}
  }
}
于 2013-08-14T06:03:05.350 回答
1

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

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

应该

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

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

于 2013-08-14T06:06:07.940 回答