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