MFC调用.exe 什么意思?exe本应该生成文件 但是没生成? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是的,我在程序1中调用了.exe,目的是生成一个文件A,程序1继续调用文件A,结果就是还没生成A,程序就继续运行了。我用waitforsingleobject,还是不对 ,稍等我把我的代码敲上来 GetExitCodePrecess()STILL_ACTIVE if(m_CODExeList.GetCount()>0) { CString strExeDir = "D:\\计划生成软件\\1000_1317_20100417"; DeleteDirectory(strExeDir); //每次调用exe之前清空文件夹,否则每次都需要查询当前生成的文件 strExeDir = "D:\\计划生成软件\\1000_1317_20100417\\*.*"; STARTUPINFO si = {sizeof(si)}; PROCESS_INFORMATION p; si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = TRUE; TCHAR cmdline[]=TEXT("D:\\计划生成软件\\OBSTRACK.exe"); DWORD dwExitCode; BOOL bRet = ::CreateProcess(NULL,cmdline,NULL,NULL,FALSE,CREATE_NO_WINDOW,NULL,NULL,&si,&p); if (bRet) { ::CloseHandle(p.hThread); ::WaitForSingleObject(p.hProcess,INFINITE); //等待子进程的退出 ::GetExitCodeProcess(p.hProcess,&dwExitCode);//获取子进程的退出码 ::CloseHandle(p.hProcess); } else { ::CloseHandle(p.hProcess); ::CloseHandle(p.hThread); }} //--- 查找当前生成的文件 CList<CString, CString> m_CodExeFileList; //存放.exe生成的文件 strExeDir = "1000_1317_20100417\\*.*"; int nIndex= strExeDir.ReverseFind('\\'); 就是后面继续执行查找时,找不到.exe 生成的文件 生成的文件,flush一下,确认文件生成了,被调用的程序在退出 TCHAR cmdline[]=TEXT("D:\\计划生成软件\\OBSTRACK.exe");是不是TCHAR cmdline[]=TEXT("D:\\计划生成软件\\OBSTRACK.exe 新文件名"); 创建进程后先sleep一下,让其他进程获取CPU控制权运行;关于文件没生成的问题有好多种处理方法:使用事件在进程间通知,文件生成后通知事件,主进程等待事件就可以了;还有一种就是不断循环查找,没找到就sleep一下,直到查找到目标文件为止 waitforsingleobject等待进程.exe退出后再继续执行。 waitforsingleobject只能等待句柄的。我推荐两种方法吧。第一种:你可以使用共享内存的方法,等待进程可以查询共享内存的完成标识符。工作进程一旦完成就改变标识符。第二种:查询进程可以使用CFindFile查询文件是否存在,你工作进程可以把没有输出完成的文件改成 *.tmp文件,真正完成了才是自主的后缀名格式。 问题不在那里,因为调用的.exe生成的文件存放目录.exe是默认的。。 我用waitforsingalobject等了,是不是我用的不对??谢谢~~ 支持,通过共享内存,比较方便,两边都是你开发的,为什么还要用文件,磁盘读写比内存读写,不是慢了一点点被调用的.exe不是我们开发的,是别人给的,没有内部代码 实在不行,你在加一句while(true){ if(文件已经存在) break;}//在做操作文件 第二种方法,只能检测到是不是生成了,但是不能保证文件生成呀第一种方法,有没有关于内存共享的资料或者书籍推荐??谢谢你们,第一次发帖,感觉大家好好,这么热心~~谁说不能保证,你查询到得文件后缀是tmp的话就是没生成完成啊,非tmp的才是生成完成的呀 http://bbs.csdn.net/topics/10332498 灵异事件啊,我用cfilefind.findfile.明明没有生成文件,它却返回1.。。太诡异了吧?? 灵异事件啊,我用cfilefind.findfile.明明没有生成文件,它却返回1.。。太诡异了吧??呵呵,一般来说,计算机不会骗人的。我以前也疑神疑鬼的,怀疑过系统,怀疑过编译器,后来证明,除了一次是编译器bug外,剩下的都是我自己错了 终于知道为什么啦!!因为在Createprocess前当前路径被修改了,所以虽然进程创建成功,即返回值是1,但是并不能生成文件!!! 如何将CPaintDC转换为CMemDC 下面删除文件夹的程序会不会造成内存泄露? 关于Cfiledialog 参数的问题 新手弱问:现在有学vc的必要吗?若有,能学到些什么? 请问一个关于位图的问题 请问RefreshData()和UpdateData(false)两个函数有什么区别? 有谁有lex(或flex)和yacc? 伪随机数生成器 为什么我这里DOS模式下不能用长文件名? debug 和 Release 编译 正版的BCGControlBar Pro V19! PNG图片的透明和黑色问题
STILL_ACTIVE
{
CString strExeDir = "D:\\计划生成软件\\1000_1317_20100417";
DeleteDirectory(strExeDir); //每次调用exe之前清空文件夹,否则每次都需要查询当前生成的文件
strExeDir = "D:\\计划生成软件\\1000_1317_20100417\\*.*";
STARTUPINFO si = {sizeof(si)};
PROCESS_INFORMATION p;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = TRUE;
TCHAR cmdline[]=TEXT("D:\\计划生成软件\\OBSTRACK.exe");
DWORD dwExitCode; BOOL bRet = ::CreateProcess(NULL,cmdline,NULL,NULL,FALSE,CREATE_NO_WINDOW,NULL,NULL,&si,&p);
if (bRet)
{
::CloseHandle(p.hThread);
::WaitForSingleObject(p.hProcess,INFINITE); //等待子进程的退出
::GetExitCodeProcess(p.hProcess,&dwExitCode);//获取子进程的退出码
::CloseHandle(p.hProcess);
}
else
{
::CloseHandle(p.hProcess);
::CloseHandle(p.hThread);
}
}
//--- 查找当前生成的文件
CList<CString, CString> m_CodExeFileList; //存放.exe生成的文件
strExeDir = "1000_1317_20100417\\*.*";
int nIndex= strExeDir.ReverseFind('\\');
是不是
TCHAR cmdline[]=TEXT("D:\\计划生成软件\\OBSTRACK.exe 新文件名");
第一种:你可以使用共享内存的方法,等待进程可以查询共享内存的完成标识符。工作进程一旦完成就改变标识符。
第二种:查询进程可以使用CFindFile查询文件是否存在,你工作进程可以把没有输出完成的文件改成 *.tmp文件,真正完成了才是自主的后缀名格式。
问题不在那里,因为调用的.exe生成的文件存放目录.exe是默认的。。
我用waitforsingalobject等了,是不是我用的不对??
谢谢~~
被调用的.exe不是我们开发的,是别人给的,没有内部代码
{
if(文件已经存在)
break;
}
//在做操作文件
第二种方法,只能检测到是不是生成了,但是不能保证文件生成呀
第一种方法,有没有关于内存共享的资料或者书籍推荐??
谢谢你们,第一次发帖,感觉大家好好,这么热心~~谁说不能保证,你查询到得文件后缀是tmp的话就是没生成完成啊,非tmp的才是生成完成的呀
灵异事件啊,我用cfilefind.findfile.明明没有生成文件,它却返回1.。。太诡异了吧??
灵异事件啊,我用cfilefind.findfile.明明没有生成文件,它却返回1.。。太诡异了吧??
呵呵,一般来说,计算机不会骗人的。我以前也疑神疑鬼的,怀疑过系统,怀疑过编译器,后来证明,除了一次是编译器bug外,剩下的都是我自己错了