Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Запуск стороннего еХешника


Автор: jmp 2.1.2008, 15:33
Понадобилось сделать чтоб чужой еХешник запустился с параметром прочтенным из другого файла,

ну прочесть из файла я предположим нашел как сделать, но как это подставить в параметр, да и как вобще запустить файл я незнаю..:(

пс: в перспективе желательно чтоб был вывбор с какой строки читать, (например строка 1 - такойто параметр, строка 2 другой.)
ну ладно, это не сейчас..

Автор: archimed7592 2.1.2008, 16:05
Цитата(jmp @  2.1.2008,  15:33 Найти цитируемый пост)
о как это подставить в параметр, да и как вобще запустить файл я незнаю..:(

std::system, CreateProcess

Автор: MAKCim 2.1.2008, 16:09
Код

static int execute(const char * arguments[], size_t count) {
    static char buffer[SIZE];
    unsigned int offset = 0, index = 0;
    int length;
    for (; count-- && (length = snprintf(buffer + offset, SIZE - offset, "%s", arguments[index])) < SIZE - offset; 
        offset += length + 1, buffer[length] = ' ');
    if (length >= SIZE - offset)
        return -1;
    return system(buffer);
}

Автор: jmp 2.1.2008, 19:35
archimed7592
MAKCim
спасибо что отозвались, но я что то торопился, забыл написать что желательно использование iostream+fstream
 и много много коментов smile 
т.к. хочу всеже понять как это работает..
ПС: с printf нехотелось бы, вот запись в файл у меня примерно такая:
Код

ofstream txt("gx.txt");
txt <<"ABCD "<<x<<;
txt.close();

чтение вставку и запуск хотелось бы тоже в этом духе..
извините если что smile

Автор: JackYF 2.1.2008, 19:40
Цитата(jmp @  2.1.2008,  19:35 Найти цитируемый пост)
т.к. хочу всеже понять как это работает..
ПС: с printf нехотелось бы, вот запись в файл у меня примерно такая:

причём тут printf к запуску .exe-файла?

Автор: archimed7592 2.1.2008, 19:43
jmp, с помощью fstream/iostream exe'шник запустить сложно. Сформулируй свой вопрос поточнее(либо тебе exe'шники запускать, либо тебе в файлы писать).

Автор: jmp 2.1.2008, 20:28
Цитата(JackYF @  2.1.2008,  19:40 Найти цитируемый пост)
причём тут printf к запуску .exe-файла? 

извиняюсь, кажеться я имел ввиду Сишный стиль.

Цитата(archimed7592 @  2.1.2008,  19:43 Найти цитируемый пост)
с помощью fstream/iostream exe'шник запустить сложно

хм, жаль.. ну если будет использоваться windows.h это тоже ничего(хорошо)
хотя я слышал чтото об exec кажеться...может ошибаюсь..
 
Цитата(archimed7592 @  2.1.2008,  19:43 Найти цитируемый пост)
Сформулируй свой вопрос поточнее(либо тебе exe'шники запускать, либо тебе в файлы писать). 

запускать конечно с параметром из переменной,
а примерчик записи в файл я привел к тому что это вроде стиль с++ .. которого я и стараюсь придерживаться (printf это ведь из Си? smile )

Автор: archimed7592 2.1.2008, 20:35
Цитата(jmp @  2.1.2008,  20:28 Найти цитируемый пост)
хотя я слышал чтото об exec кажеться...может ошибаюсь..

POSIX only.

Автор: MAKCim 2.1.2008, 20:42
Цитата(archimed7592 @  2.1.2008,  20:35 Найти цитируемый пост)
POSIX only. 

вроде NT также имеет подсистему POSIX-окружения
это к вопросу о кроссплатформенности

Автор: jmp 2.1.2008, 20:58
archimed7592
MAKCim,
тссс..я незнаю чтоэто...
но насчет остального мне удалось более менее понятно объяснить? 

Автор: bsa 2.1.2008, 21:06
jmp, ну а в чем тогда проблема?
Код
#include <string>
#include <sstream>
#include <vector>
#include <cstdlib>
...
typedef std::vector<std::string> StringVector;
...
int execute(const std::string &prgName, const StringVector &args)
{
     std::stringstream ss;
     ss << prgName;
     for(StringVector::const_iterator i = args.begin(); i != args.end(); ++i)
         ss << ' ' << *i;
     return std::system( ss.str().c_str() );
}
...
int main()
{
    ...
    StringVector args;
    args.push_back("param1");
    args.push_back("param2");
    ...
    args.push_back("paramN");
    int result = execute("program.exe", args);
    ...
}

Автор: archimed7592 2.1.2008, 21:07
Цитата(jmp @  2.1.2008,  20:58 Найти цитируемый пост)
но насчет остального мне удалось более менее понятно объяснить?  

Угу, а нам? smile

Код

CreateProcess(
  _T("app.exe someparam") /* LPCTSTR lpApplicationName */,
  NULL /* LPTSTR lpCommandLine */,
  NULL /* LPSECURITY_ATTRIBUTES lpProcessAttributes */,
  NULL /* LPSECURITY_ATTRIBUTES lpThreadAttributes */,
  TRUE /* BOOL bInheritHandles */,
  0 /* DWORD dwCreationFlags */,
  NULL /* LPVOID lpEnvironment */,
  NULL /* LPCTSTR lpCurrentDirectory */,
  NULL /* LPSTARTUPINFO lpStartupInfo */,
  NULL /* LPPROCESS_INFORMATION lpProcessInformation */);

или
Код

std::system("app.exe someparam");

Автор: jmp 2.1.2008, 22:00
bsa
archimed7592
ребята, яже говорю, параметр читаеться из файла..
Цитата(jmp @  2.1.2008,  20:28 Найти цитируемый пост)
запускать конечно с параметром из переменной

это я неправильно выразился да? :((

Автор: archimed7592 2.1.2008, 22:02
Я вот не пойму: ты вместо "app.exe ..." не можешь подставить значение своей переменной? Ну выглядеть это будет примерно как 
Код

std::system(("app.exe " + param).c_str());

Автор: bsa 2.1.2008, 23:00
jmp, я же тебе не готовую программу показал, а кусок + пример использования. Кто тебе мешает загрузить в вектор args данные из файла? Тем более, что это делается очень просто:
Код
StringVector args(std::istream_iterator(file_stream), std::istream_iterator());

Автор: jmp 7.1.2008, 06:31
наконец нашел свою тему. всем спасибо, я понял.
ПС: а для тогочтобы спросить про выбор с какой строки читать создавать еще одну тему? (поиск использовал, ненашел ничего подходящего)

Автор: archimed7592 7.1.2008, 08:11
Цитата(jmp @  7.1.2008,  06:31 Найти цитируемый пост)
а для тогочтобы спросить про выбор с какой строки читать создавать еще одну тему? 

Да. Один топик - один вопрос.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)