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

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

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

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

19.01.2014, 16:12. Просмотров 790. Ответов 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 минуты
Ну может кто то поможет?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
_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
Регистрация: 27.10.2013
Сообщений: 12
19.01.2014, 16:28  [ТС]     Вместо переменных окружения -> переменная из командной строки #3
C++
1
 int dwRet = /*GetEnvironmentVariable(_T("TIME"),*/ _ttoi(argv[1]);
Делал, получаю ошибку!
_script_
169 / 137 / 34
Регистрация: 01.05.2012
Сообщений: 414
19.01.2014, 16:28     Вместо переменных окружения -> переменная из командной строки #4
Вот пример вызова этой программы:
Название: Снимок.PNG
Просмотров: 99

Размер: 1.4 Кб

Соответственно все эти параметры можно записать в переменные
monolit
180 / 180 / 21
Регистрация: 24.03.2011
Сообщений: 651
Завершенные тесты: 1
19.01.2014, 16:29     Вместо переменных окружения -> переменная из командной строки #5
Я нашел только одно использование argv во всем этом коде. Может быть у тебя просто argc==0? Ну или я не так понял вопрос(что немудрено, ибо описание ошибки мягко говоря туманно, по кр. мере для меня)
kravam
быдлокодер
1696 / 875 / 44
Регистрация: 04.06.2008
Сообщений: 5,345
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
Регистрация: 27.10.2013
Сообщений: 12
19.01.2014, 16:47  [ТС]     Вместо переменных окружения -> переменная из командной строки #7
argc!=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;
}
Вот вызов:
Вместо переменных окружения -> переменная из командной строки
_script_
169 / 137 / 34
Регистрация: 01.05.2012
Сообщений: 414
19.01.2014, 16:57     Вместо переменных окружения -> переменная из командной строки #9
Цитата Сообщение от МихЭдНал Посмотреть сообщение
Может потому что ты запускаешь из студии и не передаешь ни каких параметров из командной строки?
МихЭдНал
0 / 0 / 0
Регистрация: 27.10.2013
Сообщений: 12
19.01.2014, 17:06  [ТС]     Вместо переменных окружения -> переменная из командной строки #10
Так я в Студии прописываю что передать как команду строки!

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

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

C++ Аргументы командной строки
Аргументы командной строки C++
C++ Как выводить переменные окружения и аргументы командной строки?
Переменная czBankNumber не инициализируется? вместо значений квадратики 2 шт и все C++
Задержка командной строки C++

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

Или воспользуйтесь поиском по форуму:
_script_
169 / 137 / 34
Регистрация: 01.05.2012
Сообщений: 414
19.01.2014, 21:56     Вместо переменных окружения -> переменная из командной строки #14
Тогда ошибка в другом месте) и дело не в получении параметров из командной строки.
Yandex
Объявления
19.01.2014, 21:56     Вместо переменных окружения -> переменная из командной строки
Ответ Создать тему
Опции темы

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