【代码备忘】阻塞执行程序、获取文件图标

欢迎加入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 

你可能感兴趣的:(线程,mfc,VC)