win32 API 搜索路径失败

Posted

技术标签:

【中文标题】win32 API 搜索路径失败【英文标题】:win32 API SearchPath fails 【发布时间】:2013-11-12 19:01:42 【问题描述】:

win32 API SearchPath API 无法找到“telnet.exe”二进制路径,即使它存在于 system32 中。

但是,当我使用相同的代码搜索 notepad.exe 时,它​​会返回文件路径。令我困惑的是notepad.exe和telnet.exe都在同一个目录中,即C:\windows\system32。

这是我写的代码

char path[MAX_PATH] = 0;
LPSTR* ptr = NULL;

DWORD dwRet = SearchPathA(NULL, "telnet.exe",
    NULL, MAX_PATH, (LPSTR)path, ptr);

这将始终返回 0,GetLastError 为 2(未找到文件)

知道这里发生了什么吗?

我在 x64 机器上使用 windows 2008 R2 企业版

感谢和问候 苏尼尔

【问题讨论】:

【参考方案1】:

它不起作用,因为您的应用程序是 32 位的并且受到File System Redirector 的影响。您的应用程序不在C:\Windows\System32 中查找,而是被重定向到C:\Windows\SysWow64

notepad.exe 存在于System32SysWow64 中,但telnet.exe 仅存在于System32 中。因此,您的应用程序在搜索路径时找不到它。

您可以通过调用Wow64DisasbleWow64FsRedirection 为您的应用程序禁用此行为。但请注意文档链接中的警告,这些警告表明只能暂时禁用此功能,然后再重新启用。

【讨论】:

看起来,而不是锁定 或者使用sysnative别名传递SearchPath()第一个参数中未重定向的System32文件夹,file system redirector不会重定向:“32位应用程序可以访问本机系统通过将 %windir%\Sysnative 替换为 %windir%\System32 的目录。WOW64 将 Sysnative 识别为特殊别名,用于指示文件系统不应重定向访问。这种机制灵活且易于使用,因此,推荐绕过文件系统重定向的机制。”

以上是关于win32 API 搜索路径失败的主要内容,如果未能解决你的问题,请参考以下文章

调用Win32 API 之CreateCursor函数失败

解决 win32-x64-64_binding.node 下载失败

解决 win32-x64-64_binding.node 下载失败

CreateProcess失败;代码193.%/不是有效的win32应用程序

[python win32使用Windows Installer API失败,但perl正常-我在python中做错了什么?

ocx控件加载失败