На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Параметры коммандной строки
    Помогите плиз ...

    Какими функциями можно узнать параметры коммандной строки ?

    Коммандная строка имеет вид:
    ExpandedWrap disabled
       
      моя_программа.exe -u root -s "тема" adr@mail.ru текст_сообщения


    Пробовал пользоваться так:
    ExpandedWrap disabled
       
          CString Path;
       
          //Определим входные параметры
          CCommandLineInfo p;
          ParseCommandLine(p);
          Path = p.m_strFileName;


    Но в данном случае выберается только параметр <root> ???
      Держи:
      ExpandedWrap disabled
         
        class   CCmdLineArgv
        {
        public:
            CCmdLineArgv( LPTSTR pCmdLine)
            : m_pArgv(NULL), m_pCmdLine(NULL), m_tArgc(0)
            {
                if(!pCmdLine) return;
                m_pCmdLine = new TCHAR[ _tcslen(pCmdLine) + sizeof(TCHAR)];
                if(!m_pCmdLine) return;
                _tcscpy( m_pCmdLine, pCmdLine);
                bool inwords = false;
                TCHAR* pTmp = m_pCmdLine;
                for( ; *pTmp; pTmp++)
                {
                    if( *pTmp == TCHAR(' ') || *pTmp == TCHAR('\t') )
                    { if(inwords) { *pTmp = TCHAR('\0'); inwords = false; } }
                    else
                    { if(!inwords) { m_tArgc++; inwords = true; } }
                }
                m_pArgv = new TCHAR*[ m_tArgc];
                pTmp = m_pCmdLine;
                for( size_t i = 0; i < m_tArgc; i++)
                {
                    m_pArgv[i] = pTmp;
                    pTmp += DWORD(_tcslen(pTmp)) + sizeof(TCHAR);
                }
            }
            //---------------------------------------------------------
            virtual   ~CCmdLineArgv() { delete[] m_pArgv; delete[] m_pCmdLine; }
            //---------------------------------------------------------
            LPCTSTR   operator [] ( size_t idx) const
            { return idx < m_tArgc ? LPCTSTR(m_pArgv[ idx]) : NULL; }
            //---------------------------------------------------------
            size_t  Count() const { return m_tArgc; }
            //---------------------------------------------------------
        private:
            size_t  m_tArgc;
            TCHAR** m_pArgv;
            TCHAR*  m_pCmdLine;
        };


      Юзанье:
      ExpandedWrap disabled
         
        ...
        CCmdLineArgv argv( GetCommandLine());
        for( size_t i = 0; t < argv.Count(); t++)
        {
            if( !stricmp( argv[ t], "-u")) { ... }
            if( !stricmp( argv[ t], "тема")) { ... }
        }
        Да спасибо - класс работает !
        Но столкнулся с непредвиденной проблемой !
        В последнем параметре перед именем файла стоит знак <
        и потому все после этого знака, включая его самого, в коммандную строку НЕ ПОПАДАЕТ ??!

        Подскажите как выровнять ситуацию ?
          Кажется вот отсюда можно вытянуть всё, попробуй :

          ExpandedWrap disabled
             
            BOOL CMyApp::InitInstance()
            {
                AfxEnableControlContainer();
               #ifdef _AFXDLL
                 Enable3dControls(); // Call this when using MFC in a shared DLL
               #else
                Enable3dControlsStatic(); // Call this when linking to MFC statically
               #endif
              
               SetRegistryKey(_T("MyApp"));
              
               /////////////////////////   Вот оно !!!!! :
              for (int i = 1; i < __argc; i++)
              {
                 LPCTSTR pszParam = __targv[i];
                 CString parsParamStr = pszParam;
                 if (_T("-d")==(CString) pszParam)
                 {
                    m_bStartLog = TRUE;
                 }
              }
              
              CDlgWelcome Dialog;
              if (IDOK == Dialog.DoModal())
              {
                 CMyDlg 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;
            }


          Попробуй , может поможет ;)
            Цитата
            VAV, 16.01.04, 08:32
            В последнем параметре перед именем файла стоит знак <
            и потому все после этого знака, включая его самого, в коммандную строку НЕ ПОПАДАЕТ ??!

            Командный процессор распознает это как перенаправление ввода в твою программу и не делает частью командной строки.
              Цитата Flex_Ferrum @ 16.01.04, 06:56
              Цитата
              VAV, 16.01.04, 08:32
              В последнем параметре перед именем файла стоит знак <
              и потому все после этого знака, включая его самого, в коммандную строку НЕ ПОПАДАЕТ ??!

              Командный процессор распознает это как перенаправление ввода в твою программу и не делает частью командной строки.

              Это все хорошо - НО как мне получить эти данные ?
                Цитата
                VAV, 16.01.04, 10:51
                Это все хорошо - НО как мне получить эти данные ?

                Эти - никак. Хвост строки в этом случае интерпретируется самим командным процессором и прогремме не передается
                  Цитата Flex_Ferrum @ 16.01.04, 07:55
                  Цитата
                  VAV, 16.01.04, 10:51
                  Это все хорошо - НО как мне получить эти данные ?

                  Эти - никак. Хвост строки в этом случае интерпретируется самим командным процессором и прогремме не передается

                  Но ведь программа как-то обрабатывает эти данные ???
                    Цитата
                    VAV, 16.01.04, 11:01
                    Но ведь программа как-то обрабатывает эти данные ???

                    Нет. В этом случае stdin программы открыт не с консоли, а из файла. И делает это командный процессор при запуске программы.
                      Цитата Flex_Ferrum @ 16.01.04, 08:17
                      Цитата
                      VAV, 16.01.04, 11:01
                      Но ведь программа как-то обрабатывает эти данные ???

                      Нет. В этом случае stdin программы открыт не с консоли, а из файла. И делает это командный процессор при запуске программы.

                      Но как мне заполучить содержимое этого файла ?
                      Уж подругому просто никак не изменить этот параметр !
                        Читать из стандартного ввода (cin, stdin) - и будет тебе содержимое этого файла.
                          Цитата Flex_Ferrum @ 16.01.04, 08:32
                          Читать из стандартного ввода (cin, stdin) - и будет тебе содержимое этого файла.

                          Спасибо все работает теперь (((-:
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0480 ]   [ 16 queries used ]   [ Generated: 1.05.24, 22:41 GMT ]