欢迎加入C/C++ QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611
MFC代码备忘
阻塞执行程序:
由于用到阻塞执行,会让主进程假死,所以这里是在线程里面执行了轮训。
unsigned int __stdcall ThreadFunc_BlockRunning(void *lpvoid) //线程函数 { pair<SHELLEXECUTEINFO ,CDialog_Step_YY *> *pWork = static_cast<pair<SHELLEXECUTEINFO ,CDialog_Step_YY *> *>(lpvoid); if(pWork != NULL && pWork->second != NULL) { ShellExecuteEx(&pWork->first); DWORD dwExitCode; GetExitCodeProcess(pWork->first.hProcess,&dwExitCode); while (dwExitCode == STILL_ACTIVE) { Sleep((DWORD)5); GetExitCodeProcess(pWork->first.hProcess, &dwExitCode); } CloseHandle(pWork->first.hProcess); } pWork->second->ThreadRunOver(pWork); return 0; }
开启线程的代码片段,把执行的程序和程序参数用pair传入线程。线程执行结束记得delete pair
SHELLEXECUTEINFO si; ZeroMemory(&si, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SEE_MASK_NOCLOSEPROCESS; si.lpVerb = L"open"; si.nShow = SW_SHOW; switch(m_threadRunflag) { case THREAD_RUN_PROCESS_EDIT_ENCRYPT: //记事本打开文件 si.lpFile = L"notepad.exe"; si.lpParameters = m_threadStringParam; break; case THREAD_RUN_PROCESS_RUN_ENCRYPT: //默认打开文件 si.lpFile = m_threadStringParam; break; default:return; } pair<SHELLEXECUTEINFO,CDialog_Step_YY *> *params = new pair<SHELLEXECUTEINFO,CDialog_Step_YY *>(make_pair(si,this));// new 的记得delete _beginthreadex(NULL, 0, ThreadFunc_BlockRunning, params, 0, NULL);
ShellExecuteEx的返回值
//返回值可能的错误有: = 0 {内存不足} ERROR_FILE_NOT_FOUND = 2; {文件名错误} ERROR_PATH_NOT_FOUND = 3; {路径名错误} ERROR_BAD_FORMAT = 11; {EXE 文件无效} SE_ERR_SHARE = 26; {发生共享错误} SE_ERR_ASSOCINCOMPLETE = 27; {文件名不完全或无效} SE_ERR_DDETIMEOUT = 28; {超时} SE_ERR_DDEFAIL = 29; {DDE 事务失败} SE_ERR_DDEBUSY = 30; {正在处理其他 DDE 事务而不能完成该 DDE 事务} SE_ERR_NOASSOC = 31; {没有相关联的应用程序} //ShowCmd 参数可选值: SW_HIDE = 0; {隐藏} SW_SHOWNORMAL = 1; {用最近的大小和位置显示, 激活} SW_NORMAL = 1; {同 SW_SHOWNORMAL} SW_SHOWMINIMIZED = 2; {最小化, 激活} SW_SHOWMAXIMIZED = 3; {最大化, 激活} SW_MAXIMIZE = 3; {同 SW_SHOWMAXIMIZED} SW_SHOWNOACTIVATE = 4; {用最近的大小和位置显示, 不激活} SW_SHOW = 5; {同 SW_SHOWNORMAL} SW_MINIMIZE = 6; {最小化, 不激活} SW_SHOWMINNOACTIVE = 7; {同 SW_MINIMIZE} SW_SHOWNA = 8; {同 SW_SHOWNOACTIVATE} SW_RESTORE = 9; {同 SW_SHOWNORMAL} SW_SHOWDEFAULT = 10; {同 SW_SHOWNORMAL} SW_MAX = 10; {同 SW_SHOWNORMAL}
获取文件图标有两种方法:
1)
HICON hIcon = ::ExtractIcon(AfxGetInstanceHandle(),filePath,0); if(hIcon) m_oldLogo.SetIcon(hIcon);2)
SHFILEINFO sfi; SHGetFileInfo(str,0,&sfi,sizeof(sfi),SHGFI_ICON|SHGFI_LARGEICON|SHGFI_USEFILEATTRIBUTES); int i=sfi.iIcon; CStatic* pStatic = (CStatic*) GetDlgItem(IDC_STATIC); HICON hIcon=sfi.hIcon; pStatic->SetIcon (hIcon);