CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

一个程序启动另一个程序的问题,刚注意到的,大家来```讨论讨论``指点指点 顺祝大家新年快乐

楼主rageliu(天气好了就去长白山看水怪去了,嘿嘿...)2006-01-24 16:11:34 在 VC/MFC / 基础类 提问

程序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

相关问题

  • 讨论一下美萍网管程序启动的原理?
  • SqlServer-BCP程序讨论.
  • SqlServer-BCP程序讨论.
  • setsystemtime???????? 高手们,讨论,讨论!指点,指点!
  • 窗体程序启动先后顺序问题?大哥指点
  • 讨论,讨论屏保程序,散分
  • 程序代码大讨论
  • 讨论] 如何将程序放置软盘上启动电脑并显示一段信息?
  • 是程序员的进来讨论讨论
  • !!!!!!!!!!!讨论一下中国的程序员

关键词

  • 函数
  • 文件
  • 解决
  • 进程
  • 路径
  • 程序
  • 启动
  • 守护
  • x pl o
  • 句柄

得分解答快速导航

  • 帖主:rageliu
  • ncucf
  • ouyh12345
  • ncucf
  • ekauq
  • thisisll
  • thisisll
  • yanedanny
  • alen_ghl
  • lzzqqq

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo