ShellExecute崩溃了

时间:2011-08-12 09:08:25

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

我有一个程序在ShellExecute()指令崩溃。如果我使用方法system(),一切正常,但我已经读到system()是邪恶的......

我正在使用Visual Studio 2010 SP1。

所以有我的函数调用ShellExecute:

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
}

这是我的错误:

Unhandled exception at 0x640361c3 in Aneto Sol.exe: 0xC0000005: Access violation reading location 0x0ba29bb0.

调试器在这里打破:

void __cdecl operator delete(void* p)
{
#if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG)
    _free_dbg(p, _NORMAL_BLOCK);
#else
    free(p);
#endif
}

这就是我的调用堆栈:

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崩溃了吗?比你的帮助。

3 个答案:

答案 0 :(得分:1)

正如Cory Nelson所说,错误不在API本身,而是在MFC中。可能存在导致应用程序崩溃的ShellExecute挂钩。

答案 1 :(得分:1)

我也遇到过类似的MFC应用程序。它在我的笔记本电脑上工作但是在将代码移动到我的桌面后,它间歇性地崩溃了VS2008。看看ShellExecute的文档,似乎将lpOperation置为NULL并不是那么安全,因为它会自动选择特定于系统的操作。所以我用_T(“open”)作为操作,到目前为止它工作正常。

p.s我在资源管理器和网址中打开路径。

答案 2 :(得分:-2)

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

我是 Delphi 程序员,从 WinXP 开始我使用这样的语法:

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

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

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

在 Windows 10 20H2 和 21H1 上,如果 ShellExecute 在 DLL 中,此方法会挂起主应用程序。

我发现解决这个问题的方法是在

之后添加两行

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

睡眠(1200);

Application.ProcessMessages;

问候 米