前段时间遇到一个Qt项目,其中需要调用外部进程文件去解析CAD文件
刚开始使用的Qt的QProcess去调用外部进程,但是在进程启动后waiforFinish直接返回了false程序继续往下执行,造成未等解析完毕就去调用的问题;
后来改用WinExec的方式去解析,存在同样的问题,最后通过<Windows.h> 下的CreateProcess()函数成功解决,故在此记录下
BOOL CreateProcess(
LPCTSTR lpApplicationName, // 应用程序名称
LPTSTR lpCommandLine, // 命令行字符串
LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程的安全属性
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程的安全属性
BOOL bInheritHandles, // 是否继承父进程的属性
DWORD dwCreationFlags, // 创建标志
LPVOID lpEnvironment, // 指向新的环境块的指针
LPCTSTR lpCurrentDirectory, // 指向当前目录名的指针
LPSTARTUPINFO lpStartupInfo, // 传递给新进程的信息
LPPROCESS_INFORMATION lpProcessInformation // 新进程返回的信息
);
STARTUPINFO si = { sizeof(si) };//0
PROCESS_INFORMATION pi;
_bstr_t bstr(batFile.toStdString().c_str());
LPTSTR szCommandLine = (LPTSTR)bstr;//有权限的都可以打开
BOOL fSuccess = CreateProcess(NULL, szCommandLine, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);//参数意义
DWORD dwExitCode;
if (fSuccess)//把主进程暂停,等待子进程终止
{
//暂停主进程的执行,直到child终止,该代码才可以继续运行
DWORD pro = WaitForSingleObject(pi.hProcess, 5000);
GetExitCodeProcess(pi.hProcess, &dwExitCode);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
其中szCommandLine 为传入的命令 如果传入的为字符串格式,需要进行转化,转化为LPTSTR类型
C++:string转换LPTSTR,const char*
#include
#include <comdef.h>
#include
using namespace std;
int main(int argc, char* argv[])
{
string cCommandline=“hello world!”;
//string转换LPTSTR
_bstr_t bstr(cCommandline.c_str());
LPTSTR lr=(LPTSTR)bstr;
//string转换const char*
const char *p1 = cCommandline.c_str();
const char *p2 = cCommandline.data();
printf("%s %s\n",p1,p2);
cout <<p1 << " " << p2 << endl;
}