Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
МихЭдНал
0 / 0 / 0
Регистрация: 27.10.2013
Сообщений: 12
1

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

19.01.2014, 16:12. Просмотров 907. Ответов 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
Ответы с готовыми решениями:

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

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

Переменная czBankNumber не инициализируется? вместо значений квадратики 2 шт и все
Инициализация находится в функции-члене void setBunkNumber(); #include...

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

Разные значения переменных окружения в командной строке и в настройках системы
Кратко излагаю суть проблемы: Устанавливаю переменную PATH через графический...

13
_script_
171 / 139 / 70
Регистрация: 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_
171 / 139 / 70
Регистрация: 01.05.2012
Сообщений: 414
19.01.2014, 16:28 4
Вот пример вызова этой программы:
Название: Снимок.PNG
Просмотров: 99

Размер: 1.4 Кб

Соответственно все эти параметры можно записать в переменные
0
monolit
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
Завершенные тесты: 1
19.01.2014, 16:29 5
Я нашел только одно использование argv во всем этом коде. Может быть у тебя просто argc==0? Ну или я не так понял вопрос(что немудрено, ибо описание ошибки мягко говоря туманно, по кр. мере для меня)
0
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,531
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_
171 / 139 / 70
Регистрация: 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_
171 / 139 / 70
Регистрация: 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
1486 / 1132 / 164
Регистрация: 05.12.2011
Сообщений: 2,279
19.01.2014, 17:46 11
а дебагом пользоваться умеете?
в http://img-fotki.yandex.ru/get/9758/...56fbcb52_L.jpg
жмете повтор. попадаете в место развала. далее по стеку вызовом попадаете в место
своего кода, откуда был кривой вызов. смотрите на переменные, чего там и как.
мой стандартный совет, хоть и не по теме: освойте студийный дебагер, раз работаете в ней.
1
_script_
171 / 139 / 70
Регистрация: 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_
171 / 139 / 70
Регистрация: 01.05.2012
Сообщений: 414
19.01.2014, 21:56 14
Тогда ошибка в другом месте) и дело не в получении параметров из командной строки.
0
19.01.2014, 21:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2014, 21:56

Иероглифы вместо символов при перенаправлении вывода из командной строки в Label
Создаю процесс командной строки и пытаюсь вывести в Label все то, что ввожу в...

Переменная окружения
здравствуйте,помогите создать переменная окружения,хранящая год вашего...

ОС Переменная окружения
Дела тесты по ОС не могу найти ответы на некторые вопросы помогиет пожалуста...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

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