微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从32位WOW进程获取Program Files文件夹path不是Program Filesx86?

我需要从32位WOW进程获取本地(而不是WOW)程序文件目录的path。

当我将CSIDL_PROGRAM_FILES(或CSIDL_PROGRAM_FILESX86)传递到SHGetSpecialFolderPath时,它将返回WOW(Program Files(x86))文件夹path。

如果可能的话,我宁愿避免使用环境variables。

我想比较一下从registry中读取的一些值,如果这些值指向我的应用程序的WOW或本地版本的path,那么我的代码会执行某些操作,如果没有,则会执行其他操作。 要找出我的应用程序的本地和WOW版本的预期,我需要得到的path“程序文件(x86)”和“程序文件”。

AppWinStyle不能用于Process.start

找不到w3wp进程

C#在运行时或更早时间设置stream程描述

system()调用行为

在Linux服务器后台运行PHP文件进行推送通知

java:停止subprocess

防止subprocess在c#中显示shell窗口

Windows显示驱动程序挂钩,64位

来自task_struct的完整进程名称

混合使用32位和64位共享对象/库

我感谢所有的帮助,特别是在这个线程中的警告。 但是,我真的需要这条路,最终我是这样做的:

(清除错误检查清楚,使用风险自负等)

WCHAR szNativeProgramFilesFolder[MAX_PATH]; ExpandEnvironmentStrings(L"%ProgramW6432%",szNativeProgramFilesFolder,ARRAYSIZE(szNativeProgramFilesFolder);

让我引用雷蒙德(Raymond Chen在这个问题上的优秀博客

在64位Windows上,32位程序在仿真层中运行。 这个仿真层模拟x86架构,虚拟化cpu文件系统,注册表,环境变量,系统信息功能,所有这些东西。 如果一个32位程序试图查看系统,它将看到一个32位系统。 例如,如果程序调用GetSystemInfo函数来查看哪个处理器正在运行,那么将会被告知它在32位处理器上运行,具有32位地址空间,在32位天空和32位位32位树的鸟。

这就是仿真的要点:通过模拟32位执行环境来保持32位程序的快乐。

问题是“从32位应用程序中查找x64程序文件目录的方法是什么?”

答案是“ 与系统配合,而不是反对如果你是一个32位的程序,那么每当你尝试与外部世界进行交互的时候,你都会对抗模拟器。 相反,只需将您的安装程序重新编译为64位程序即可。 让32位安装程序检测到它正在64位系统上运行,然后启动64位安装程序。 64位安装程序不会在32位仿真层中运行,所以当它试图复制文件或更新注册表项时,它将看到真正的64位文件系统和真正的64位注册表。

如果你仍然想这样做,我建议阅读这篇博文的评论,因为它们包含一些好的提示

你在正确的道路上 – 使用FOLDERID_ProgramFilesX64的KNowNFOLDERID

SHGetKNownFolderPath函数可用于检索给定KNownFolder的完整路径。

根据臭名昭着的雷蒙德(Raymond Chen)最近的一个帖子,这几乎肯定是一个坏主意。 详情请看这里 。 底线,我认为这是可以做到的,但是这是一项艰苦的工作,而且几乎肯定有一个更简单的方法

微软建立了WOW仿真层,让你的生活更轻松。 不要浪费他们所有的时间和精力:-)。

也许如果你告诉我们为什么你需要非WOW Program Files目录,我们可以进一步提供帮助。

我需要它从logonscript中获取x64程序文件夹并使用:

Dim oWshShell : Set oWshShell = CreateObject("WScript.Shell") Dim sProgramDirPath : sProgramDirPath = oWshShell.ExpandEnvironmentStrings("%ProgramW6432%") WScript.Echo sProgramDirPath

获得“程序文件”路径的最好和普遍的方法是从注册表中查询它:

64位进程可以查询HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows CurrentVersion ProgramFilesDir 获取“C: Program Files”( HKEY_LOCAL_MACHINE SOFTWARE Wow6432Node Microsoft Windows CurrentVersion ProgramFilesDir) 86)”

32位进程(Wow64)可以查询HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows CurrentVersion ProgramFilesDirKEY_WOW64_64KEY选项获取“C: Program Files文件(x86)” HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows CurrentVersion ProgramFilesDir获取“C: Program Files”

代码

OpenKey(hKey,HKEY_LOCAL_MACHINE,L"SOFTWARE\Microsoft\Windows\CurrentVersion",KEY_READ | KEY_WOW64_64KEY); QueryStringValue(hKey,L"ProgramFilesDir",sValue);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐