本意想在代码中启动bcp.exe,隐藏bcp.exe的界面,并等待bcp.exe执行完毕后继续。代码如下: //执行bcp out命令
SHELLEXECUTEINFO  ShExecInfo = {0};

ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
CString strBCP = GetSybaseBCPPath();
if(strBCP == "")
strBCP = "bcp.exe";
else
strBCP += "\\bcp.exe";
ShExecInfo.lpFile = strBCP.GetBuffer(strBCP.GetLength());
ShExecInfo.lpParameters = (LPCTSTR)strCommand;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_HIDE;
ShExecInfo.hInstApp = NULL;

ShellExecuteEx(&ShExecInfo); 
::WaitForSingleObject(ShExecInfo.hProcess, INFINITE); //有的电脑上,这里不等待
::CloseHandle(ShExecInfo.hProcess);
在有些电脑中是正常的,有些电脑中出现异常:bcp.exe界面没有被隐藏掉,程序没有等待bcp.exe执行完毕。
界面没有隐藏的电脑bcp也是一样的在执行,我自己写了一个dos界面的小程序,用ShellExecuteEx进行调用,也是一样的问题,不知道是什么原因,会不会跟操作系统的某些设置有关呢?请大家帮忙分析分析,不胜感谢~~~

解决方案 »

  1.   

    CreateProcess试过了,有一样的问题
      

  2.   


    if (ShellExecuteEx(&ShExecInfo) && ShExecInfo.hProcess)
    {
        WaitForSingleObject(ShExecInfo.hProcess, INFINITE);
        ...                    
    }或者用CreateThread
      

  3.   

    不行的话用::FindWindow找出这个窗口句柄,再用::ShowWindow(hwnd,SW_HIDE)
      

  4.   

    我比较好奇的是为什么有的机子可以,有的机子不行
    我做过下面的尝试:
    1、替换system32里面的shell32.dll;
    2、关掉杀毒软件;
    3、替换数据库的bcp.exe;
    都没有用。
      

  5.   


    调用另一个执行程序一般都是用ShellExcuteEx(或ShellExcute)或者CreateProcess吧?
    CreateThread是怎么个用法?可以传递被调程序的参数么?
      

  6.   

    还是用CreateProcess解决了,之前CreateProcess没用对。。不过还是想知道为什么ShellExcuteEx会有这样的问题。。