一个程序启动另一个程序的问题,刚注意到的,大家来```讨论讨论``指点指点 顺祝大家新年快乐
程序A需要一直运行,所以做了个守护程序,FindWindow()发现A退出后就启动A,A中有个操作是将自己的执行信息写入日志文件.(很简单的代码,不过发现了个问题,以前没注意到)
发现的问题: 直接启动A,日志文件创建在A的所在目录,而由守护程序启动A时,A的日志文件就创建在了守护程序的目录
我试图通过下面方法解决:
1. 将A中日志文件路径由".\xx.txt"改为先用GetCurrentDirectory()取得路径后加上"\xx.txt",问题依旧. 当由守护程序启动A时,A里面的GetCurrentDirectory居然取了守护程序的路径.
2. 怀疑是守护进程中启动A时使用的函数在做怪,于是分别使用了下面的函数:
WinExec()
ShellExecute()
CreateProcess()
system()//这个衰函数都试了,未果...
问题依然存在
是什么原因?通过函数启动一个进程和直接双击启动到底有什么区别?
问题点数:145、回复次数:12Top
1 楼ncucf(ncu晨风)回复于 2006-01-24 16:18:14 得分 20
ShellExecute()
CreateProcess()
这两个函数不是有设置当前路径的功能吗?
默认新建一个子进程,肯定会继承父进程的当前路径的!Top
2 楼ouyh12345(五岭散人)回复于 2006-01-24 16:18:38 得分 15
解决方法到很简单,把A的路径放在注册表里。Top
3 楼ncucf(ncu晨风)回复于 2006-01-24 16:21:47 得分 10
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
);
shellexecute在内部也是调用createprocess,那个lpCurrentDirectory不就是设置当前运行路径吗?
通过一个函数启动另一个进程,就是父进程启动一个子进程,默认的当前路径就和父进程保持一致,如果是双击的开一个进程的话,父进程就是explorer,当前路径自然就是进程的映象文件所在的路径咯!Top
4 楼ekauq()回复于 2006-01-24 16:22:52 得分 20
解决方法到很简单,把A的路径放在注册表里
-------------
那还不如直接用绝对路径Top
5 楼thisisll(学习王高李,有个好身体)回复于 2006-01-24 16:22:55 得分 15
这些在 WINDOWS核心编程里讲了好多~~Top
6 楼thisisll(学习王高李,有个好身体)回复于 2006-01-24 16:25:12 得分 5
大多数情况下,应用程序将另一个进程作为独立的进程来启动。这意味着进程创建和开始
运行后,父进程并不需要与新进程进行通信,也不需要在完成它的工作后父进程才能继续运行。
这就是E x p l o r e r的运行方式。当E x p l o r e r为用户创建一个新进程后,它并不关心该进程是否继续
运行,也不在乎用户是否终止它的运行。
若要放弃与子进程的所有联系, E x p l o r e r必须通过调用C l o s e H a n d l e来关闭它与新进程及它
的主线程之间的句柄
你可以试试Top
7 楼yanedanny(守望者)回复于 2006-01-24 16:30:11 得分 20
守护程序反正知道程序A的目录位置,写死的了。Top
8 楼rageliu(天气好了就去长白山看水怪去了,嘿嘿...)回复于 2006-01-24 16:45:46 得分 0
嘿嘿,用了朋友最后145分,晚点本人来了就揭贴Top
9 楼alen_ghl(东方求*)回复于 2006-01-24 16:57:57 得分 20
用这个比较安全
char szBuffer[MAX_PATH];
GetModuleFileName(NULL,szBuffer,MAX_PATH);
CString strPath=CString(szBuffer);
strPath=strPath.Left(strPath.ReverseFind('\\'));
Top
10 楼lzzqqq(Jonersen)回复于 2006-01-24 17:10:32 得分 20
父进程的环境变量带给了子进程所然.
BOOL CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,//把这里置FALSE.
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
Top
11 楼rageliu(天气好了就去长白山看水怪去了,嘿嘿...)回复于 2006-01-24 17:20:20 得分 0
极端之疯狂无敌心疼我的最后145分,本来想到了200分过年散给大家的,现在被朋友劈没了:)
to ncucf(ncu晨风):
见解正确,指定路径即可
to thisisll(速度八十迈):
CloseHandle() 关闭子进程句柄,关闭子进程的主线程句柄.是好的编程习惯,但我朋友这的问题显然不是这个原因
to ouyh12345():
这种问题还是不写注册表的好
to yanedanny(守望者):
呵呵,新年快乐,直接了当的方法,不过路径一变就死翘翘了...
to alen_ghl(东方求*):
说的有道理,GetCurrentDirectory()函数有时候取的路径是不正确的,还是用GetModuleFileName()函数自己解析比较理想Top
12 楼rageliu(天气好了就去长白山看水怪去了,嘿嘿...)回复于 2006-01-24 17:21:37 得分 0
to lzzqqq(Jonersen) :
FALSE?不行的Top




