关于程序中运行另外一个程序的问题

fqyugu 2003-10-19 09:18:29
1,我用以下方法运行另外一个程序
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = str;
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);

str 为程序的完整路径名,
问题是另外的程序比较大,机子也慢,导致程序在屏幕上出现要很长时间
如果这时点击另外的按钮就会将原来的程序弄到后面去,虽然程序运行了,但是看不见,需要让他在最前面,怎么办,
另:运行一些游戏会死机或黑屏,会是什么原因
2,程序有时会出现非法操作,一些dll有问题,这些错误能不能调,如果能怎么办
先谢谢了

...全文
81 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
fqyugu 2003-10-23
  • 打赏
  • 举报
回复
用楼上各位的方法都能启动程序,但是假如我启动的程序不是全屏,
启动以后再点击我的程序新的程序就到后面了,能不能将我的
程序设成不能激活,等新的程序结束以后再使我的窗口可以点击
windows_editor 2003-10-22
  • 打赏
  • 举报
回复
STARTUPINFO si;
PROCESS_INFORMATION piProcess;
int i = -1;
si.cb=sizeof(STARTUPINFO);
si.lpReserved = NULL;
si.lpTitle =NULL;
si.dwXSize = 100;
si.dwYSize = 50;
si.dwX = 0;
si.dwY = 0;
si.lpDesktop = "";
si.wShowWindow = SW_SHOWMINNOACTIVE;
si.cbReserved2 = 0;
si.lpReserved2 = NULL;
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESIZE|STARTF_USEPOSITION;

i = CreateProcess(NULL,
"your cmd",
NULL,
NULL,
TRUE, DETACHED_PROCESS, NULL, NULL,
&si, &piProcess);
return i;
fqyugu 2003-10-22
  • 打赏
  • 举报
回复
我只能晚上上网,白天做东西,如果结贴比较晚还望各位高手见谅
fqyugu 2003-10-22
  • 打赏
  • 举报
回复
to: Darlinton(纳闷老头)
http://expert.csdn.net/Expert/topic/2377/2377737.xml?temp=.1326868

我晕,找人帮忙大概用不着这种方式吧,
我的一个朋友原来也有类似的情况,他的是电源不稳,不知道你的是不是
xiaohedou 2003-10-22
  • 打赏
  • 举报
回复
要运行程序用 CreateProcess,像wangjinwang(王进)讲的比较清楚了!
Richuen22 2003-10-21
  • 打赏
  • 举报
回复
SHELLEXECUTEINFO ShExecInfo = {0};
改为
SHELLEXECUTEINFO ShExecInfo;
ZeroMemory(ShExecInfo, sizeof(SHELLEXECUTEINFO) );
试之,再不行换用比较先进的
CreateProcess
CSDN的贴子有许多它的例子的。

ShExecInfo.hwnd = this->m_hWnd;// 或::GetActiveWindows()
再检查
ShExecInfo.hProcess是否为NULL
fengqinggao 2003-10-21
  • 打赏
  • 举报
回复
可以有一个笨办法,就是让主线程不断的检测你新执行的程序是否关闭(可以检测它的进程句柄是否存在),如果不存在了,就开始执行自己的程序。
由于主线程在不断地检测,所以不会响应其他消息(不过有可能在循环完毕后响应,需要注意,没有测试,不好意思),而自己的时钟还是有效,你可以试试看。:)
fqyugu 2003-10-21
  • 打赏
  • 举报
回复
我最初的目的是想做成类似MessageBox()的效果,当运行另外的程序时,不能再点击我的程序,用waitforsingleobject()则我的程序里的时钟好像就没用了,怎么办
各位高手帮帮忙啊,谢谢
mqbwx 2003-10-19
  • 打赏
  • 举报
回复
Up !
孤必有邻 2003-10-19
  • 打赏
  • 举报
回复
1、ShellExecuteEx不能控制启动进程为当前,CreateProcess可以,这里有个例子可以参考:
http://www.yangning.com/cgi-bin/topic.cgi?forum=1&topic=95&show=0

2、通过代码启动进程存在当前路径问题,要么在启动进程函数的参数中指定,要么在其东汉数前,设置路径,SetCurrentDirectory
fengqinggao 2003-10-19
  • 打赏
  • 举报
回复
第一个问题用CreateProcess()函数吧,在它的 LPSTARTUPINFO lpStartupInfo 参数中可以设置窗口显示的各种状态,可以到MSDN中去找。他对新程序的控制能力比ShellExecuteEx强多了,而且方便。

死机或者黑屏,是不是显卡的问题?

如果是纯粹的发行版的Dll,是不能调试的,但是自己编制的调试版的Dll是可以跟踪调试的,系统的Dll属于前者,所以据我所知是不能进行调试的。
yintongshun 2003-10-19
  • 打赏
  • 举报
回复
用VC如何调用别的可执行文件(exe)


方法一:

CFileFind ff;
if(ff.FindFile("sql.exe"))
{
ShellExecute(NULL,"open","sql.exe",NULL,NULL,SW_SHOW);
}
else
{
AfxMessageBox("文件没找到!");
}


方法二

CFileFind ff;
if(ff.FindFile("sql.exe"))
{
WinExec("sql.exe",SW_SHOW);
}
else
{
AfxMessageBox("文件没找到!");
}

 

fqyugu 2003-10-19
  • 打赏
  • 举报
回复
非法操作有时候才出,我也不知什么情况下出现
原来用shellexecute时可以启动游戏,没有死机和黑屏,换了以后才出的

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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