visualc中的奇怪行为&x2B+;ShellExecute()函数 我尝试编写一个简短的VisualStudioC++基于MFC对话框的应用程序,并使用 SeExcel()/遇到一个奇怪的行为。 #包括“stdafx.h” #包括 #包括“Shlwapi.h” #包括“TestShellExecute.h” #包括“TestShellExecuteDlg.h” //CTestShellExecuteApp 开始消息映射(CTestShellExecuteApp,CWinApp) ON_命令(ID_HELP,&CWinApp::OnHelp) 结束消息映射() //唯一的CTestShellExecuteApp对象 CTestShellExecuteApp; //CTestShellExecuteApp初始化 BOOL CTestShellExecuteApp::InitInstance() { CWinApp::InitInstance(); 国际PTR响应; 如果(路径文件存在(文本(“Config.ini”)) nResponse=IDOK; 其他的 { CTestShellExecuteDlg dlg; m_pMainWnd=&dlg; nResponse=dlg.DoModal(); } 如果(nResponse==IDOK) ExecuteApp(); 返回FALSE; } void CTestShellExecuteApp::ExecuteApp(void) { ShellExecute(空,文本(“打开”),文本(“记事本”), 文本(“test.txt”),NULL,SW_SHOWNORMAL); 返回; }
如果文件“Config.ini”存在,代码将直接转到ShellExecute(),记事本将正常启动 当文件“Config.ini”不存在时,代码将打开一个对话框,其中只有OK和Cancel 按“确定”后,对话框返回并运行ShellExecute()。记事本没有启动。如果我注释掉行visualc中的奇怪行为&x2B+;ShellExecute()函数 我尝试编写一个简短的VisualStudioC++基于MFC对话框的应用程序,并使用 SeExcel()/遇到一个奇怪的行为。 #包括“stdafx.h” #包括 #包括“Shlwapi.h” #包括“TestShellExecute.h” #包括“TestShellExecuteDlg.h” //CTestShellExecuteApp 开始消息映射(CTestShellExecuteApp,CWinApp) ON_命令(ID_HELP,&CWinApp::OnHelp) 结束消息映射() //唯一的CTestShellExecuteApp对象 CTestShellExecuteApp; //CTestShellExecuteApp初始化 BOOL CTestShellExecuteApp::InitInstance() { CWinApp::InitInstance(); 国际PTR响应; 如果(路径文件存在(文本(“Config.ini”)) nResponse=IDOK; 其他的 { CTestShellExecuteDlg dlg; m_pMainWnd=&dlg; nResponse=dlg.DoModal(); } 如果(nResponse==IDOK) ExecuteApp(); 返回FALSE; } void CTestShellExecuteApp::ExecuteApp(void) { ShellExecute(空,文本(“打开”),文本(“记事本”), 文本(“test.txt”),NULL,SW_SHOWNORMAL); 返回; },mfc,shellexecute,Mfc,Shellexecute,如果文件“Config.ini”存在,代码将直接转到ShellExecute(),记事本将正常启动 当文件“Config.ini”不存在时,代码将打开一个对话框,其中只有OK和Cancel 按“确定”后,对话框返回并运行ShellExecute()。记事本没有启动。如果我注释掉行m_pMainWnd=&dlg,然后在对话框返回IDOK后,记事本将启动 有人能解释一下这种行为吗?这似乎只是一个时间问题(如果您设置了m\u pMainWnd更多的清理工作已经完成)。如果我添加一个睡眠(300)在Sh
m_pMainWnd=&dlg代码>,然后在对话框返回IDOK后,记事本将启动
有人能解释一下这种行为吗?这似乎只是一个时间问题(如果您设置了m\u pMainWnd
更多的清理工作已经完成)。如果我添加一个睡眠(300)代码>在ShellExecute
之后执行。您应该记住,ShellExecute
的某些操作可能是异步完成的(例如DDE)。我会考虑切换到<代码> ShellExecuteEx <代码> >代码> SexMaskSoNoasyNc<代码>,或者在终止之前添加<代码>睡眠< /代码>。< /P>
另外,请不要忘记初始化COM,正如。中明确指出的那样,这似乎只是一个时间问题(如果您设置了m\u pMainWnd
则会进行更多清理)。如果我添加一个睡眠(300)代码>在ShellExecute
之后执行。您应该记住,ShellExecute
的某些操作可能是异步完成的(例如DDE)。我会考虑切换到<代码> ShellExecuteEx <代码> >代码> SexMaskSoNoasyNc<代码>,或者在终止之前添加<代码>睡眠< /代码>。< /P>
另外,请不要忘记按照中的说明初始化COM。什么是m_pMainWnd?m_pMainWnd是主窗口。由于这是一个dialogbox应用程序,dialogbox是主窗口。该行由MFC向导生成。什么是m_pMainWnd?m_pMainWnd是主窗口。由于这是一个dialogbox应用程序,dialogbox是主窗口。这一行是由MFC向导生成的。将Sleep(300)放在ShellExecute()之后确实解决了这个问题。我尝试将ShellExecuteEx()与SEE_MASK_NOASYNC一起使用,其行为与ShellExecute()相同。谢谢你的回答。将Sleep(300)放在ShellExecute()之后确实解决了这个问题。我尝试将ShellExecuteEx()与SEE_MASK_NOASYNC一起使用,其行为与ShellExecute()相同。谢谢你的回答。
#include "stdafx.h"
#include <iphlpapi.h>
#include "Shlwapi.h"
#include "TestShellExecute.h"
#include "TestShellExecuteDlg.h"
// CTestShellExecuteApp
BEGIN_MESSAGE_MAP(CTestShellExecuteApp, CWinApp)
ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()
// The one and only CTestShellExecuteApp object
CTestShellExecuteApp theApp;
// CTestShellExecuteApp initialization
BOOL CTestShellExecuteApp::InitInstance()
{
CWinApp::InitInstance();
INT_PTR nResponse;
if (PathFileExists(TEXT("Config.ini")))
nResponse = IDOK;
else
{
CTestShellExecuteDlg dlg;
m_pMainWnd = &dlg;
nResponse = dlg.DoModal();
}
if (nResponse == IDOK)
ExecuteApp();
return FALSE;
}
void CTestShellExecuteApp::ExecuteApp(void)
{
ShellExecute(NULL, TEXT("open"), TEXT("notepad"),
TEXT("test.txt"), NULL, SW_SHOWNORMAL);
return;
}