【问题标题】:Using AssocQueryString to get 64-bit application command from 32-bit application, but not working使用 AssocQueryString 从 32 位应用程序获取 64 位应用程序命令,但不工作
【发布时间】:2013-09-12 00:34:31
【问题描述】:

我尝试使用 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 位应用程序。

感谢您的所有帮助。

【问题讨论】:

  • 此函数从注册表中检索信息。你在和Registry Redirector打架。
  • 谢谢你,@HansPassant。我尝试使用 AssocQueryString 但此功能仍然失败。最后,我简单地使用 RegQueryValue 和 KEY_WOW64_64KEY 标志来获得我想要的。非常感谢您的信息!

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


【解决方案1】:

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

1) ASSOCSTR_COMMAND 替换为 ASSOCSTR_EXECUTABLE

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

2) SUCCEEDED 为非负数表示为真

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

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

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

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

cf>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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多