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

时间:2013-09-08 10:28:02

标签: 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位应用信息吗?

  3. 顺便说一句,我不想​​将我的应用程序编译成64位应用程序。

    感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

1)ASSOCSTR_COMMAND替换为ASSOCSTR_EXECUTABLE

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

2)SUCCEEDED是非负数表示真实

<(>(((HRESULT)(hr))&gt; = 0)

因此,如果您检查成功,请检查结果是否等于零

<强> 2。还有另一种方法可以从32位应用程序获取64位应用程序信息吗?

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

CF&GT; 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)