ShellExecute返回成功,但不执行文件

时间:2017-04-05 16:19:09

标签: c++ visual-studio visual-c++ visual-studio-2015 shellexecute

我最近在一个关于Win32 API ShellExecute()函数的项目中遇到了一个奇怪的问题。

该程序使用Visual C ++ 2015在ANSI模式下编译。

int ret = (int)ShellExecuteA(0, "open", "C:\\Users\\Maverick\\stratum.jpg", NULL, NULL, SW_SHOWNORMAL);
printf("ShellExecute return value: %i\n", ret);

在上面的代码中,ShellExecute()返回42,因此它应该成功。但是,它实际上并没有打开文件。

我没有特权问题,即使以管理员身份运行程序,也会遇到同样的问题。

事实上,我可以通过这种方式成功运行文件:

system("C:\\Users\\Maverick\\stratum.jpg");

但我并不想被迫使用system()

此外,在我将项目迁移到较新的Visual Studio之前,我使用的是Visual C ++ 6.0,并且代码运行良好。

有什么线索可能是什么问题?

编辑:ShellExecuteEx()也会返回成功(1),但不会打开文件。

SHELLEXECUTEINFO ShExecInfo;
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = NULL;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "C:\\Users\\Maverick\\stratum.jpg";
ShExecInfo.lpParameters = NULL;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOWNORMAL;
ShExecInfo.hInstApp = NULL;

int ret = (int)ShellExecuteExA(&ShExecInfo);

1 个答案:

答案 0 :(得分:0)

好吧,看起来我发现了问题并且确实很奇怪。也许内存泄漏。 在ShellExecute / ShellExecuteEx调用之前,在循环(例如,数万个)中多次调用函数CreatePopupMenu()将使此问题发生。 除非我们使用DestroyMenu BEFORE ShellExecute调用释放HMENU。 看起来像某种类型的内存泄漏,非常感谢你,无论如何你的答案。