我编写过滤系统并使用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...}
我做错了什么?
答案 0 :(得分:2)
您应该比较“不区分大小写”:lstrcmpi
您需要传递正确的字符数组...
此外,您应该始终检查函数调用的结果值!
如果您明确使用GetModuleFileNameEx
=>,则不应使用wchar_t
的TCHAR版本。 GetModuleFileNameExW
<!/ p>
如果您想获取当前进程的名称,还应该使用方法GetModuleFileNameW
!这更可靠!
另外你应该使用MAX_PATH而不是_MAX_FNAME,因为该方法也可能返回完整路径!
还要确保您的字符串正确终止NUL!
此外,您必须知道返回的路径可能包含完整路径,因此与流程名称的比较永远不会匹配...
此外,您必须知道路径可能会缩写短文件名! (不是在你的情况下,因为名称不超过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...}
}
}
答案 1 :(得分:1)
你需要声明存储空间,只需指针就不够了
LPWSTR moduleName = {0};
GetModuleFileNameEx (GetCurrentProcess(),0,moduleName,_MAX_FNAME );
应该是
TCHAR moduleName[_MAX_PATH];
GetModuleFileNameEx(GetCurrentProcess(), 0, moduleName, _countof(moduleName));
并使用不区分大小写的lstrcmpi()
。