CreateProcess为什么在程序中能执行在线程中不能执行

fietiger 2008-07-20 12:43:57
void CLoaderDlg::OnButton1()
{
PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo; //This is an [in] parameter
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field
StartupInfo.wShowWindow = SW_HIDE;
if(CreateProcess(NULL, "D:\\tiff2pdf.exe -o D:\\xx.pdf D:\\xx.tif",
NULL,NULL,FALSE,CREATE_NO_WINDOW,NULL,
NULL,&StartupInfo,&ProcessInfo))
{
WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
}
else
{
MessageBox("The process could not be started...");
}
}
在这里是可以执行的,可是我另外开了一个线程,在线程里面就不能执行,不知道为什么,是同样的代码啊。
BOOL CTransthread::Transfile(CString& filename)
{

PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo; //This is an [in] parameter
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field
if(CreateProcess(NULL, "D:\\tiff2pdf.exe -o D:\\xx.pdf D:\\xx.tif",
NULL,NULL,TRUE,NORMAL_PRIORITY_CLASS,NULL,
NULL,&StartupInfo,&ProcessInfo))
{
WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
}
else
{
AfxMessageBox("The process could not be started...");
}

return true;

}
搞了好久了,真是不清楚这有什么区别。请高手赐教!
...全文
103 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fietiger 2008-07-21
  • 打赏
  • 举报
回复
有可能,算了,不管了,能用就行了.
gaoteng1984 2008-07-20
  • 打赏
  • 举报
回复
子线程被执行到了吗?也许子线程没有被正确创建,或者创建之后没来的及得到调度的机会,进程就结束了
cnzdgs 2008-07-20
  • 打赏
  • 举报
回复
线程是怎么创建的?
这样试试:
char cmdLine[100] = "D:\\tiff2pdf.exe -o D:\\xx.pdf D:\\xx.tif";
if(CreateProcess(NULL, cmdLine, ……
thirddata 2008-07-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fietiger 的回复:]
奇怪吧,呵呵,我就把
(CString& filename)改成了(CString filename)就可以了.
[/Quote]
这说明你的filename被主线程之类的程序用到了,你在这个子线程里把这个值改了。
fietiger 2008-07-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gaoteng1984 的回复:]
子线程被执行到了吗?也许子线程没有被正确创建,或者创建之后没来的及得到调度的机会,进程就结束了
[/Quote]
被执行到了,然后前面的代码都能执行,一执行到那里就死,搞了好久,然后我把那个传入的参数改了下就可以用了,真是奇怪哦,我改好的:
BOOL CTransthread::Transfile(CString filename)
{

CString path = filename;
path=path.Left(path.ReverseFind('\\'));
path+="\\";
SetCurrentDirectory(path);


CString file = filename;
file = file.Left(file.ReverseFind('.'));
file +=".pdf ";


char sPatha[MAX_PATH];
char* buffer=sPatha;
CString inifname;
GetModuleFileName(NULL, buffer, MAX_PATH);
inifname = CString(buffer);
delete buffer;
inifname = inifname.Left(inifname.ReverseFind('\\'));


CString exeFullName = inifname+"\\tiff2pdf.exe";

CString strParem = " -o "+file + filename;
exeFullName += strParem;
PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo; //This is an [in] parameter
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field

if(CreateProcess(NULL, exeFullName.GetBuffer(0),
NULL,NULL,TRUE,CREATE_NO_WINDOW,NULL,
NULL,&StartupInfo,&ProcessInfo))
{
WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
}
else
{
AfxMessageBox("The process could not be started...");
}

return true;

}
奇怪吧,呵呵,我就把
(CString& filename)改成了(CString filename)就可以了.
wanshi131 2008-07-20
  • 打赏
  • 举报
回复
加断点调试一下啊

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧