首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ShellExecute崩溃

ShellExecute崩溃
EN

Stack Overflow用户
提问于 2011-08-12 17:08:25
回答 3查看 2.6K关注 0票数 1

我有一个程序在执行ShellExecute()指令时崩溃了。如果我使用system()方法,一切都很好,但我读到system()是邪恶的……

我使用的是Visual Studio2010 SP1。

所以这里有一个调用ShellExecute的函数:

代码语言:javascript
复制
ATC_GENERIC_API void __cdecl atcGenericLaunchGAG()
{
    HINSTANCE ret = ShellExecute( NULL, NULL, "MyExe.exe", NULL, "C:\\Opt\\", SW_SHOW );
    if( int(ret) > 32 )
    {
        //OK
        return;
    }
    //NOK
}

这是我得到的错误:

代码语言:javascript
复制
Unhandled exception at 0x640361c3 in Aneto Sol.exe: 0xC0000005: Access violation reading location 0x0ba29bb0.

调试器在这里中断:

代码语言:javascript
复制
void __cdecl operator delete(void* p)
{
#if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG)
    _free_dbg(p, _NORMAL_BLOCK);
#else
    free(p);
#endif
}

这就是我的调用堆栈:

代码语言:javascript
复制
mfc100d.dll!operator delete(void * p)  Line 347 + 0xc bytes C++
mfc100d.dll!operator delete[](void * p)  Line 360 + 0x9 bytes C++
mfc100d.dll!CPlex::FreeDataChain()  Line 43 + 0xf bytes C++
mfc100d.dll!CMapPtrToPtr::RemoveAll()  Line 87 C++
mfc100d.dll!CMapPtrToPtr::FreeAssoc(CMapPtrToPtr::CAssoc * pAssoc)  Line 147 C++
mfc100d.dll!CMapPtrToPtr::RemoveKey(void * key)  Line 252 C++
mfc100d.dll!CHandleMap::RemoveHandle(void * h)  Line 230 C++

有没有人已经在ShellExecute上遇到过这样的错误,或者谁可以向我解释为什么ShellExecute会那样崩溃?谢谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-12 20:55:40

正如Cory Nelson所说,错误不在于API本身,而在于MFC。可能有一个ShellExecute钩子会导致应用程序崩溃。

票数 1
EN

Stack Overflow用户

发布于 2013-04-21 12:53:26

我在MFC应用程序中也遇到过类似的情况。它在我的笔记本电脑上工作,但在将代码移到我的桌面后,它断断续续地崩溃了VS2008。查看ShellExecute的文档,似乎将NULL设置为lpOperation并不那么安全,因为它会自动选择系统特定的操作。所以我使用_T("open")作为操作,到目前为止它工作得很好。

附言:我在资源管理器和url中打开了path。

票数 1
EN

Stack Overflow用户

发布于 2021-07-14 03:57:59

在Windows20xx、21xx上,调用ShellExecute时出现问题。

我是Delphi程序员,因为WinXP,我使用如下语法:

ShellExecute(Handle,‘ShellExecute’,PChar('abcd.pdf'),nil,nil,SW_SHOWNORMAL);

在默认的PDF查看器中打开PDF文件。

这在主应用程序和它在WinXP、Win7和Win10 1809上的DLL-s上运行得很好。

在Windows1020H2和21H1上,如果ShellExecute在动态链接库中,此方法会挂起主应用程序。

我发现解决这个问题的方法是在后面添加2行

ShellExecute(Handle,‘ShellExecute’,PChar('abcd.pdf'),nil,nil,SW_SHOWNORMAL);

睡眠(1200);

Application.ProcessMessages;

关于我

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7037933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档