Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
МихЭдНал
0 / 0 / 0
Регистрация: 27.10.2013
Сообщений: 12
#1

Вместо переменных окружения -> переменная из командной строки - C++

19.01.2014, 16:12. Просмотров 810. Ответов 13
Метки нет (Все метки)

Короче ребята такое дело, надо переделать так что бы вместо переменных окружения надо что бы вместо переменных окружения программа принимала аргументы командной строки(брала от туда значение переменных).
Но все мои попытки заканчиваются тем, что сборка прошла, а при работе программы я получаю вылет с ошибкой!

Сами коды

3_4

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "stdafx.h"
#include <windows.h>    //(Joint) 
#include <stdio.h>  
#include <conio.h>   
int _tmain(int argc, _TCHAR* argv[])
{
  STARTUPINFO si[2];
  memset(&si[0],0,sizeof(si[0]));
  memset(&si[1],0,sizeof(si[1]));
  si[0].cb=sizeof(STARTUPINFO);
  si[1].cb=sizeof(STARTUPINFO);
  PROCESS_INFORMATION pi[2];
  SYSTEMTIME                st;
  FILETIME      ft;                                       
 
  GetLocalTime(&st);
  SystemTimeToFileTime(&st,&ft);
  unsigned __int64 MinTime= (((unsigned _int64)ft.dwHighDateTime)<<32)|ft.dwLowDateTime;
  _tprintf(_T("Start values:\n%x%x\n"),(int)(MinTime>>32),(int)((MinTime<<32)>>32));
 
   TCHAR path[MAX_PATH];
   TCHAR Name[]=_T("2.exe");
   
   BOOL b=CreateProcess(0,Name,0,0,false,0,0,0,&si[0],&pi[0]);
 if(!b)             
   {
     _tprintf(_T("Error create Process Run_NotePad\n"));         return -1;
   }
   WaitForSingleObject(pi[0].hProcess,INFINITE);
 
   TCHAR p[MAX_PATH];
   *((__int64*)p)=MinTime;
 
   SetEnvironmentVariable(_T("TIME"),p);
   TCHAR proc_name[]=_T("3.exe");
   BOOL b1=CreateProcess(0,proc_name,0,0,false,CREATE_SUSPENDED,0,0,&si[1],&pi[1]);
   if(!b1)
   {    
     _tprintf(_T("Error create Process GetFileSize\n"));     return -2;   
   }
   SetPriorityClass(pi[1].hProcess, BELOW_NORMAL_PRIORITY_CLASS);
   ResumeThread(pi[1].hThread);
 
   WaitForSingleObject(pi[1].hProcess,INFINITE);
 
   CloseHandle(pi[0].hProcess);
   CloseHandle(pi[1].hProcess);
   _getch();
  return 0;
}
2.exe

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "stdafx.h"
#include <windows.h>        // (Run_Notpad.exe) 
#include <stdio.h>
#include <conio.h>
int _tmain(int argc, _TCHAR* argv[])
{
PROCESS_INFORMATION pi;
STARTUPINFO si;
memset(&si,0,sizeof(si));
si.cb=sizeof(si);
TCHAR proc_name[]=_T("notepad.exe");
BOOL b=CreateProcess(0,proc_name,0,0,false,0,0,0,&si,&pi);
if (!b)
{
_tprintf(_T("Error no notepad\n"));
     return 1;
}
WaitForSingleObject(pi.hProcess,INFINITE);      
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
_tprintf(_T("After Notepad is closed. Press any key\n"));
 
 _getch();
return 0;
}
3.exe

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "stdafx.h"
#include <windows.h>    //(GetFileSize.exe)
#include <stdio.h>  
#include <conio.h>
#include <string.h>
int _tmain(int argc, _TCHAR* argv[])
{      
    FILETIME CreateFileTime;
    unsigned __int64 MinTime;
    TCHAR buf[1000];
 
    int dwRet = /*GetEnvironmentVariable(_T("TIME"),*/ _ttoi(argv[1]);
    _tprintf(_T("Environment lenght %d\n"), dwRet);
    GetEnvironmentVariable(_T("TIME"), buf, dwRet);
 
    MinTime=*((__int64 *)buf); 
    _tprintf(_T("Obtained values:\n%x%x\n"),(int)(MinTime>>32),(int)((MinTime<<32)>>32));
 
    HANDLE hFile;
    BOOL b;
    WIN32_FIND_DATA FindFileData;
    TCHAR path[MAX_PATH];
 
    GetCurrentDirectory(MAX_PATH,path);  _tprintf_s(_T("%s\n"),path);
    HANDLE h=FindFirstFile(_T("*.txt"),&FindFileData);
    if (h==INVALID_HANDLE_VALUE)_tprintf(_T("Template File not found\n"));
    else
    { 
        while (1)               
        {   
            CreateFileTime=FindFileData.ftCreationTime;
            FileTimeToLocalFileTime(&CreateFileTime,&CreateFileTime);
            unsigned _int64 i64CreateFileTime= 
                (((unsigned _int64) CreateFileTime.dwHighDateTime)<<32)|CreateFileTime.dwLowDateTime;
            if (i64CreateFileTime>MinTime )
            {
                hFile=CreateFile (FindFileData.cFileName,GENERIC_READ,0,0,OPEN_EXISTING,0,0);
                DWORD len,high;
                _tprintf(_T("%s \n"),FindFileData.cFileName);
                len=GetFileSize( hFile,&high);
                _tprintf(_T("%d\n"),len);
                CloseHandle(hFile);
            }
            b=FindNextFile(h,&FindFileData);
            if (!b)
            {   
                _tprintf(_T("All files are over\n"));  
                break;
            }
        }       
    }//else
    //_getch();
    return 0;
}
Очень прошу помочь, чувствую что рядом но не получается сделать нормально!

Добавлено через 21 час 33 минуты
Ну может кто то поможет?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.01.2014, 16:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вместо переменных окружения -> переменная из командной строки (C++):

Как выводить переменные окружения и аргументы командной строки? - C++
Доброго времени суток) Может рассказать как выводить переменные окружения и аргументы командной строки? Задание звучит примерно так:...

Переменная окружения PATH - C++
напишите пожалуйста как будет выглядеть прога которая дополняет значение PATH именем каталога, указанным в командной строке Пишу на С.

Переменная czBankNumber не инициализируется? вместо значений квадратики 2 шт и все - C++
Инициализация находится в функции-члене void setBunkNumber(); #include &lt;iostream&gt; #include &lt;cstdlib&gt; class cAccount{ public: ...

Слияних 2 файлов в третий + строки + использование командной строки - C++
Помогите с заданием пожалуйста. Задано 2 файла, строки в которых упорядочены по алфавиту. Написать программу, осуществляющую слияние этих...

Разные значения переменных окружения в командной строке и в настройках системы - Администрирование Windows
Кратко излагаю суть проблемы: Устанавливаю переменную PATH через графический интерфейс(КОМПЬЮТЕР-&gt;НАСТРОЙКИ-&gt;...), сохраняю. Захожу в...

ОС Переменная окружения - Windows XP
Дела тесты по ОС не могу найти ответы на некторые вопросы помогиет пожалуста 51. Нехай змінна оточення Windows VAR має значення...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
_script_
169 / 137 / 34
Регистрация: 01.05.2012
Сообщений: 414
19.01.2014, 16:25 #2
Параметры командной строки можно получить через массив argv. Кол-во параметров - argc.
Вот пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
using namespace std;
 
 
int main(int argc, char* argv[])
{
    //Вывод параметров командной строки
    for (int i=0; i<argc; i++)
        cout << argv[i]<<endl;
    return 0;
}
0
МихЭдНал
0 / 0 / 0
Регистрация: 27.10.2013
Сообщений: 12
19.01.2014, 16:28  [ТС] #3
C++
1
 int dwRet = /*GetEnvironmentVariable(_T("TIME"),*/ _ttoi(argv[1]);
Делал, получаю ошибку!
0
_script_
169 / 137 / 34
Регистрация: 01.05.2012
Сообщений: 414
19.01.2014, 16:28 #4
Вот пример вызова этой программы:
Название: Снимок.PNG
Просмотров: 99

Размер: 1.4 Кб

Соответственно все эти параметры можно записать в переменные
0
monolit
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 667
Завершенные тесты: 1
19.01.2014, 16:29 #5
Я нашел только одно использование argv во всем этом коде. Может быть у тебя просто argc==0? Ну или я не так понял вопрос(что немудрено, ибо описание ошибки мягко говоря туманно, по кр. мере для меня)
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
19.01.2014, 16:47 #6
Цитата Сообщение от МихЭдНал Посмотреть сообщение
Короче ребята такое дело, надо переделать так что бы вместо переменных окружения
а как ты находишь блок переменных окружения или какую-нибудь одну переменную окружения? Я, насколько знаю, для этого используется функция GetEnvironmentStrings, а у тебя её нет.

Добавлено через 4 минуты
Ещё можно получить адрес блока переменных окружения через командную строку,

C++
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main(int argc, char ** argv, char ** envp)
{
        while ( *envp )
                puts(*envp++);
 
 getchar();
 getchar();
        return 0;
}
но ты и этот вариант не используешь.

Переделывать-то что? С нуля, похоже, писать надо.
0
МихЭдНал
0 / 0 / 0
Регистрация: 27.10.2013
Сообщений: 12
19.01.2014, 16:47  [ТС] #7
argc!=0.

Вместо переменных окружения -> переменная из командной строки

Ошибка

Вместо переменных окружения -> переменная из командной строки
0
_script_
169 / 137 / 34
Регистрация: 01.05.2012
Сообщений: 414
19.01.2014, 16:55 #8
У меня этот код работает:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    //Вывод параметров командной строки
    int dwRet = _ttoi(argv[1]);
    cout <<" dwRet="<<dwRet<<endl;   
 
    return 0;
}
Вот вызов:
Вместо переменных окружения -> переменная из командной строки
0
_script_
169 / 137 / 34
Регистрация: 01.05.2012
Сообщений: 414
19.01.2014, 16:57 #9
Цитата Сообщение от МихЭдНал Посмотреть сообщение
Может потому что ты запускаешь из студии и не передаешь ни каких параметров из командной строки?
0
МихЭдНал
0 / 0 / 0
Регистрация: 27.10.2013
Сообщений: 12
19.01.2014, 17:06  [ТС] #10
Так я в Студии прописываю что передать как команду строки!

Добавлено через 6 минут
Та и через командную строку ничего не меняет!
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.01.2014, 17:46 #11
а дебагом пользоваться умеете?
в http://img-fotki.yandex.ru/get/9758/...56fbcb52_L.jpg
жмете повтор. попадаете в место развала. далее по стеку вызовом попадаете в место
своего кода, откуда был кривой вызов. смотрите на переменные, чего там и как.
мой стандартный совет, хоть и не по теме: освойте студийный дебагер, раз работаете в ней.
1
_script_
169 / 137 / 34
Регистрация: 01.05.2012
Сообщений: 414
19.01.2014, 19:50 #12
Через студию у меня тоже работает)

Вместо переменных окружения -> переменная из командной строки
0
МихЭдНал
0 / 0 / 0
Регистрация: 27.10.2013
Сообщений: 12
19.01.2014, 21:53  [ТС] #13
Если взять отдельно перевод работает, а если как вся прога?
0
_script_
169 / 137 / 34
Регистрация: 01.05.2012
Сообщений: 414
19.01.2014, 21:56 #14
Тогда ошибка в другом месте) и дело не в получении параметров из командной строки.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2014, 21:56
Привет! Вот еще темы с ответами:

Переменная окружения - PHP
Привет. $uniqip=&quot;val&quot;; putenv(&quot;UNIQID=$uniqip&quot;); var_dump($_ENV);//empty!!!! var_dump(getenv(&quot;UNIQID&quot;)); Почему $_ENV пуст? ...

Переменная окружения - Bash
здравствуйте,помогите создать переменная окружения,хранящая год вашего рождения.Выведите сообщение о вашем возрасте,используя:константу...

Переменная окружения PATH - Windows
Зачем нужна переменная PATH?

Переменная окружения PHP - PHP
Windows 7. Установил XAMPP. Apache, PHP, MySQL работают. Появилась надобность запустить скрипт из командной строки, например: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.01.2014, 21:56
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru