c++ - 使用 AssocQueryString 从 32 位应用程序获取 64 位应用程序命令,但无法正常工作

标签 c++ windows winapi visual-c++ 32bit-64bit

我尝试使用 AssocQueryString 获取关联信息,myapp.exe 是 32 位可执行文件。这是我的代码。

WCHAR commandline[_MAX_PATH];
DWORD size = _MAX_PATH;
HRESULT h = AssocQueryStringW(ASSOCF_OPEN_BYEXENAME, ASSOCSTR_COMMAND, execName, 0, commandline, &size);
if (SUCCEEDED(h)) 
{ 
    ... 
}

我发现如果“execName”是一个 32 位应用程序,这个 api 就可以完美运行。 例如,

WCHAR *execName = L"mspaint.exe";

我们可以得到command = "C:\Windows\system32\mspaint.exe""%1"

但如果提供 64 位应用程序(例如:PaintDotNet.exe),SUCCEEDED(h) 将返回 FALSE。 变量 h = 0x80070483,表示“没有应用程序与文件扩展名相关联”。

从上面的观察来看,我猜这个 api 在尝试获取 64 位应用程序信息时可能会失败。

所以我的问题是:

  1. AssocQueryString 有什么我忽略或错误使用的地方吗?

  2. 还有其他方法可以从 32 位应用获取 64 位应用信息吗?

顺便说一下,我不想只将我的应用程序编译为 64 位应用程序。

感谢您的帮助。

最佳答案

<强>1。有没有我忽略或错误使用 AssocQueryString 的地方?

1) ASSOCSTR_COMMAND 替换为 ASSOCSTR_EXECUTABLE

你可以得到“C:\Windows\system32\mspaint.exe”

2) SUCCEEDED为非负数表示为true

(((HRESULT)(hr)) >= 0)

所以如果你检查成功,检查结果是否为零

<强>2。还有其他方法可以从 32 位应用获取 64 位应用信息吗?

1) 如果您的 windows x64,文件夹 C:\Windows\system32\用于 64 位文件。

比照> http://www.samlogic.net/articles/32-64-bit-windows-folder-x86-syswow64.htm C:\Windows\System32 64位文件的Windows系统文件夹(系统目录) C:\Windows\SysWOW64 32位文件的Windows系统文件夹(系统目录)

2) 只检查结果是否为零,然后打印出来。 在这种情况下不要使用 SUCCEEDED(h)。

AssocQueryString的返回值S_OK(0), E_POINTER, S_FALSE(1)

关于c++ - 使用 AssocQueryString 从 32 位应用程序获取 64 位应用程序命令,但无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18682679/

相关文章:

c++ - QSortFilterProxyModel 没有中继 dataChanged 信号

c++ - 抑制编译器警告 C++

c++ - 了解 Windows API 中消息处理的不同策略

performance - IO 其他操作性能计数器说明

c++ - 从 r 值生成 l 值

c++ - 相对于使用堆,使用带有 insert() 的 vector 作为优先级队列的开销是多少? (c++)

java - 无法连接到数据库错误 : java. sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未找到数据源名称且未指定默认驱动程序

c++ - Windows 10 上的 GetTickCount 值

c++ - 窗口聚焦时 Opengl 程序不循环

windows - 使用 'IsBadCodePtr' 来区分给定的资源类型好吗?