欢迎加入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);
欢迎加入C/C++ QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧! 158427611