本意想在代码中启动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进行调用,也是一样的问题,不知道是什么原因,会不会跟操作系统的某些设置有关呢?请大家帮忙分析分析,不胜感谢~~~
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进行调用,也是一样的问题,不知道是什么原因,会不会跟操作系统的某些设置有关呢?请大家帮忙分析分析,不胜感谢~~~
if (ShellExecuteEx(&ShExecInfo) && ShExecInfo.hProcess)
{
WaitForSingleObject(ShExecInfo.hProcess, INFINITE);
...
}或者用CreateThread
我做过下面的尝试:
1、替换system32里面的shell32.dll;
2、关掉杀毒软件;
3、替换数据库的bcp.exe;
都没有用。
调用另一个执行程序一般都是用ShellExcuteEx(或ShellExcute)或者CreateProcess吧?
CreateThread是怎么个用法?可以传递被调程序的参数么?