我现在想编一个程序关联的软件,就是不管用户点击什么应用程序,都要先执行我的程序,然后我的程序启动后在启动用户想要执行的那个程序。我在注册表中
HKEY_CLASSES_ROOT\\exefile\\shell\\open\\command位置将键值改为我的程序的路径,然后用函数AfxGetApp()->m_lpCmdLine的到用户点击的那个程序的路径,问题是每次这个函数返回的值都是空啊,我的程序每次都会运行,但是用户点击的那个程序却不会运行,请高手指点一下到底是怎么回事啊?谢谢

解决方案 »

  1.   

    直接调用GetCommandLine看看参数是什么?
      

  2.   

    我是在MFC的BOOL CDialogDlg::OnInitDialog()函数中直接调用的:str.Format("%s", GetCommandLine);结果我显示的str是乱码,这个函数应该在哪个地方调用呢?
      

  3.   

    在这里没问题的,我试过了
    GetCommandLine()返回LPTSTR
    你直接AfxMessageBox(GetCommandLine());试试
      

  4.   

    我是在MFC的CDIALOGDLG类中的OnInitDialog()函数中调用的,我觉得一开始传进来的参数应该是用户双击的那个程序的路径,但是当程序执行到这一步的时候就变成了我的程序的路径了,但是我不知道应该在什么位置执行这个函数,请个位给个意见,谢谢
      

  5.   

    首先修改注册表的那个键值,是个敏感操作,会被杀毒软件拦截而无法执行滴如果注册表修改成功了,那么实际上就是一个接收命令行参数的问题了
    用GetCommandLine()获取到的命令行参数是这样的
    比如"D:\myprogram\debug\myprogram.exe" D:\text.exe
    可以看出第一个参数就是我们的程序所在的路径,
    而空格后的就是我们双击执行程序的路径,它是作为一个参数传递过来的
    GetCommandLine()得到的命令行参数是通过空格来分隔的。
    然后就是通过字符串处理将我们双击执行程序的路径提取出来,
    再通过CreateProcess或者是SHellExecute这样的函数调用执行我们通过双击执行程序
    注意路径中文件和文件名带空格的情况,要特殊处理一下
    不知道说明白了没有 呵呵
      

  6.   

    我明白你的意思,但是我用GetCommandLine()返回的参数只有我自己程序的路径啊,没有后面的。我调用MessageBox才看过,确实没有啊!
      

  7.   

    我是在MFC基于对话框的框架下,在OnInitDialog()函数中调用的,和这个有没有什么关系?
      

  8.   

    没关系的,我就是那样用的
    你注册表键值是怎么设置的?
    Windows Registry Editor Version 5.00
    [HKEY_CLASSES_ROOT\exefile\shell\open\command]
    @="\"D:\\myprogram\\debug\\myprogram.exe\" \"%1\" %*"
    修改成你程序的路径
    保存为.reg文件,导入再试试
    这样的话得到的应该是
    "D:\myprogram\debug\myprogram.exe" "D:\test.exe"

      

  9.   

    http://topic.csdn.net/u/20080908/16/f46c79b9-1aa6-43d2-8027-ef17461901df.html
    上面是我的另一个问题,帮我解决一下吧,谢谢了。