BOOL CProtectScreenApp::InitInstance()
{
AfxEnableControlContainer(); // Standard initialization
// If you are not using these features and wish to reduce the size
//  of your final executable, you should remove from the following
//  the specific initialization routines you do not need.#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
// 
//  CProtectScreenDlg dlg;
//  m_pMainWnd = &dlg;
//  int nResponse = dlg.DoModal();
//  if (nResponse == IDOK)
//  {
//  // TODO: Place code here to handle when the dialog is
//  //  dismissed with OK
//  }
//  else if (nResponse == IDCANCEL)
//  {
//  // TODO: Place code here to handle when the dialog is
//  //  dismissed with Cancel
//  }
// 
//  // Since the dialog has been closed, return FALSE so that we exit the
//  //  application, rather than start the application's message pump.
//  return FALSE; LPTSTR lpszArgv = __argv[1];
if(lpszArgv[0]=='/')
        lpszArgv++;
if(lstrcmpi(lpszArgv,_T("s"))==0)

        CProtectScreenDlg dlg;
        m_pMainWnd = &dlg;
        int nResponse = dlg.DoModal();
        return true;
}
return FALSE;
}
这个是一个屏保的程序,最后这边要换成红色的代码
请解释下这段代码

解决方案 »

  1.   

    一个简单的命令行解析
    如果这个程序的名字,例如a.exe,后面跟了一个参数“/s”("a.exe /s"),则显示窗口CProtectScreenDlg dlg(应该是一个屏保画面窗口);否则,什么都不做,程序退出
      

  2.   

    /s应该是setup的意思。只是个选项命令。
      

  3.   

    /s就表示显示窗口CProtectScreenDlg dlg(应该是一个屏保画面窗口);否则,什么都不做,程序退出,1#已经说得很明白了啊
      

  4.   

    1#已经解释了,"/s"是你exe程序所带的命令行参数,是你自己定义的格式,不一定要是/s,-s,s等等都可以,看你自己定义,然后做相应的解析就是的了。
      

  5.   

    if(lpszArgv[0]=='/')
    lpszArgv++;
    if(lstrcmpi(lpszArgv,_T("s"))==0)

    ……
    这一段就是在判断命令后的参数啊 把if(lpszArgv[0]=='/')根据自己需要换成其他符号 执行命令时就用相应的符号
      

  6.   

    这一段就是在判断命令后的参数啊 把if(lpszArgv[0]=='/')根据自己需要换成其他符号 执行命令时就用相应的符号
    -------------------------------------------
    问题是我根本没有在cmd里执行啊,
    我是作为一个屏保的,难道屏保运行时是默认 命令为:a.exe /s那如果我改成了if(lpszArgv[0]=='-'岂不是不能用了
      

  7.   

    我说了这是个屏保的程序,最后InitInstance函数修改成我贴出来的那样的
    可是我不明白为什么要这样判断
    LPTSTR lpszArgv = __argv[1];
    if(lpszArgv[0]=='/')
    lpszArgv++;
    if(lstrcmpi(lpszArgv,_T("s"))==0)1、难道__argv[1]默认就是 /s ?2、那按照你说的,如何修改成__argv[1] 为 -s ?
      

  8.   

    楼主,就算不是CMD运行的,也可以有参数的,双击运行,在VC中DEBUG,都可以有参数的.argv[0] 是这个 exe 的文件名
    argv[1] 是这个 exe 的第一个参数
    argv[2] 第二个,类推.这个程序,是判断第一个参数是否 /s,因为如果执行时是 ...exe /s 这样的话,那么
    argv[1] = "/s",所以就拿 argv[1] 来判断
      

  9.   

    一个程序,创建一个快捷方式,在属性,目标处 xxx.exe 改为 xxx.exe /s 123 456
    那么运行的时候 argv[1] = "/s" argv[2] = "123" [3] = "456"int main(int argc, char* argv[])
    {
    for (int k=0;k<argc;k++)
    {
    printf("%s \n",argv[k]);
    }这样,多少个参数都可以打印出来看.
      

  10.   


    其实我想问的 是如果什么都不改的话,argv[k] 将会是什么内容呢?还是这个问题:
    难道__argv[1]默认就是 /s ,不是的话,InitInstance()为什么要改成那样,
    是不是屏保运行argv[1]默认就是 /s?
      

  11.   

    其实我想问的 是如果什么都不改的话,argv[k] 将会是什么内容呢?什么都不改动,只是运行,argc = 1, argv[0] 是本程序的名称 argv[1] 没有内容,访问不知道会不会出错.
    难道__argv[1]默认就是 /s ,不是的话,InitInstance()为什么要改成那样,
    是不是屏保运行argv[1]默认就是 /s?不会,一定是我们填了参数,argv[1] 才会有内容,否则 argv[1] 没有内容.很多程序,都有运行的参数,看作者的设计意图了.这个代码,作者的意思应该是要传入 /s 的参数
      

  12.   

    可是,我根本没设置这个,可能VC默认就是这个吧 /s
    我就是想知道在VC 中如何设置这个命令的,
    如何改成 -s的呢
      

  13.   

    可是,我根本没设置这个,可能VC默认就是这个吧 /s
    我就是想知道在VC 中如何设置这个命令的,
    如何改成 -s的呢
      

  14.   

    project -> setting -> debug -> program arguments 假设你输入 123 45 6789
    那么运行后 argv[1] = "123" argv[2] = "45" argv[3] = "6789"楼主可以设置参数,试运行一下.
      

  15.   

    VC 没有默认给运行的程序传参的,如果program arguments 什么也没有写,就是没有参数了.
      

  16.   

    楼主,你那个工程,会不会是人家已经在 DEBUG 的运行参数 里面已经设好了值 ,就是 /s 的?
      

  17.   

    原来是自己的工程,那你就在 project -> setting -> debug -> program arguments 处写入 /s 
    看看结果,可不可以进入你红色的代码.我拿人家一个代码,要求很多参数的程序.我也要在参数入写上 诸如
    c:\test.pgm c:\chg.pgm -c -t 30 这类的参数传入来运行的.
      

  18.   

    如果加入 /s 是可以进入 红色的代码的但是现在我没有加/s ,那么程序运行的时候(作为屏保),为什么也会有 /s 命令呢
    我就是搞不懂这个,是不是默认有 /s 命令呢
      

  19.   

    但是现在我没有加/s ,那么程序运行的时候(作为屏保),为什么也会有 /s 命令呢
    我就是搞不懂这个,是不是默认有 /s 命令呢回25楼,你是怎样去运行的?
      

  20.   

    我调试的时候,InitInstance函数是没有改的
    但是那篇文章说,如果最后农场scr屏保文件的时候
    要把这个函数处理成这样,最后做成屏保才可以,
    然后就是放到system32里,然后就是 桌面右键属性,选择这个scr,然后 就可以了(总之就是屏保文件拉)
      

  21.   

    原话是这样的:
    要使在桌面属性对话框中选择此屏保时不运行(这里不是说不让它运行),要加最后一段代码。回到VC编程界面,进入CMyApp::InitInstance()中编辑
      

  22.   

    制作scr需要处理3个参数,   就是   xxx.scr   /s   这样的,  
      分别是  
      /s   运行屏幕保护  
      /c   设置屏幕保护   (默认)  
      /p   预视效果  
       
      正常window运行一个scr是通过加   /s参数,  
      而在显示里面那个设置按钮实际上是   /c参数,  
      那个预示效果的窗口就使用了/p参数   
      

  23.   

    原来是这样,看来32楼说到重点了.windows 帮我们加上了参数
      

  24.   

    真是学习到新知识了.原来把一个exe改名为scr就可以做成屏保.
    而已双击运行或者是预览的时候,会自动传入 /s 的参数的.刚才测试了一下.
      

  25.   

    如果是.exe, windows不会传递 /s 参数, 程序也会正常, 如果是 .scr, 那windows会传递 /s 参数.
      

  26.   

    这里的预览并不是你点击"预览"按钮, 而是显示在属性页的那个小窗口的预览.
    Display Properties there is a small picture representing a display where the user can view a preview of the screen saver - the preview is called using the argument '/p'.
      

  27.   

    试了下,
    如果
    if(lstrcmpi(lpszArgv,_T("s"))==0 || lstrcmpi(lpszArgv,_T("p"))==0)
    那么Combobox选择我这个屏保或者点击设置,设置完,确定退出后,第二次进入属性对话框
    选择 屏幕包含程序 标签都会启动屏保不过如果
    if(lstrcmpi(lpszArgv,_T("s"))==0 || lstrcmpi(lpszArgv,_T("c"))==0)
    却没什么反应,