ShellExecute crashes

ShellExecute crashes

本文关键字:crashes ShellExecute      更新时间:2023-10-16

我有一个程序在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崩溃像这样?谢谢你的帮助。

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

我在一个MFC应用程序中也经历过类似的事情。它在我的笔记本电脑上工作,但在将代码移动到我的桌面后,它间歇性地崩溃了VS2008。看看ShellExecute的文档,似乎把NULL放到lpOperation不是那么安全,因为它会自动选择系统特定的操作。所以我使用_T("打开")作为操作,到目前为止它工作得很好。

p。我在资源管理器和url中打开路径。

在Windows 20xx, 21xx上,调用ShellExecute有问题。

我是Delphi程序员,因为WinXP我使用这样的语法:

ShellExecute(处理,"开放",PChar("abcd.pdf"),nil, nil, SW_SHOWNORMAL);

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

这在WinXP, Win7和Win10 1809的主应用程序和dll中运行良好。

在Windows 10 20H2和21H1这个方法挂起主应用程序,如果ShellExecute是在DLL内。

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

ShellExecute(处理,"开放",PChar("abcd.pdf"),nil, nil, SW_SHOWNORMAL);

睡眠

(1200)。

Application.ProcessMessages;

的问候M