Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CreateProcess() проблемы с passing аргументов 
V
    Опции темы
magesi
Дата 23.6.2012, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 20.5.2012

Репутация: -4
Всего: -4



Привет всем!

Создаю процесс с интерпретатором Lua

Код

BOOL status = CreateProcess(L"C:\\Program Files (x86)\\Lua\\lua52.exe",  
NULL, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi);


Трабла след. "нужно дать lua скрипт на обработку и взять результат программы на lua"

Пытался в 1-ом аргументе дописывать

Код

L"C:\\Program Files (x86)\\Lua\\lua52.exe C:\\1.lua


И пытался во второй пихать
Код

L"C:\\1.lua"


Ни один из вар-тов не воркает... Пока я буду гуглить, если кто-то поможет помочь с этой проблемой, буду крайне благодарен.

Заранее Вам спасибо
PM MAIL   Вверх
EvilsInterrupt
Дата 23.6.2012, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



magesi, 
1) Кто тебя научил что CreateProcess возвращает именно BOOL ?
2) Если ты находишься в студии,то в watch-окошке во время отладки напиши "@err,hr" и после этой CreateProcess смотри чего пишет
PM MAIL WWW ICQ Jabber   Вверх
magesi
Дата 23.6.2012, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 20.5.2012

Репутация: -4
Всего: -4



Цитата(EvilsInterrupt @ 23.6.2012,  12:29)
magesi, 
1) Кто тебя научил что CreateProcess возвращает именно BOOL ?
2) Если ты находишься в студии,то в watch-окошке во время отладки напиши "@err,hr" и после этой CreateProcess смотри чего пишет

1). Спецификация ф-ции, читай msdn, или даже в инслайте посмотри в VS

user posted image

2).

user posted image

Это сообщение отредактировал(а) magesi - 23.6.2012, 12:42
PM MAIL   Вверх
EvilsInterrupt
Дата 23.6.2012, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



п.1 снимаю, настолько привык к понятию HANDLE что оно мне везде мерещится )))

Тогда посмотри на параметр 1 и параметр 2:
Цитата

  __in_opt     LPCTSTR lpApplicationName,
  __inout_opt  LPTSTR lpCommandLine,


как видишь в одном указывается путь к файлу к примеру "c:\python32\python.exe" , а во втором ее ком-строка к примеру "--input-name d:\samples\test00.exe", это все равно что если я в cmd.exe напишу:
"c:\python32\python.exe --input-name d:\samples\test00.exe"
PM MAIL WWW ICQ Jabber   Вверх
magesi
Дата 23.6.2012, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 20.5.2012

Репутация: -4
Всего: -4



Цитата(EvilsInterrupt @  23.6.2012,  13:39 Найти цитируемый пост)
п.1 снимаю, настолько привык к понятию HANDLE что оно мне везде мерещится )))

Потому что, CreateThread HANDLE возвращает, поэтому и мерещеться, т.к. чаще с потоками возишься


Цитата(EvilsInterrupt @  23.6.2012,  13:39 Найти цитируемый пост)
как видишь в одном указывается путь к файлу к примеру "c:\python32\python.exe" , а во втором ее ком-строка к примеру "--input-name d:\samples\test00.exe", это все равно что если я в cmd.exe напишу:"c:\python32\python.exe --input-name d:\samples\test00.exe" 

что-то не понял насчет "--input-name" откуда дописывается, перечитаю еще раз msdn 

ЗЫ
http://support.microsoft.com/kb/175986

пишут, что ( но все, является "трипэде" , т.к. не воракет, то ли пьянный я, пошел дальше разбираться ):


If the ApplicationName parameter is passed and the CommandLine parameter is NULL, then the ApplicationName parameter is also used as the CommandLine. This does not mean that you can pass additional command-line parameters in ApplicationName string. For example, the following call will fail with a "File Not Found" error:
 
CreateProcess( "c:\\MyApp.exe Param1 Param2", NULL, ... )


The flexibility of the CreateProcess() function (and a possible point of confusion) arises when you pass a valid string pointer to both the ApplicationName and CommandLine parameters. This allows you to specify the application to be executed as well as the complete command line that is passed to the application. One might assume that the command line passed to the created application is a composite of the ApplicationName and CommandLine parameters, but this is not the case. As a result, a process created by CreateProcess can receive a value other than its .exe name as its "argv[0]" parameter. The following is an example of a call to CreateProcess that produces this "abnormal" behavior:
 
CreateProcess( "c:\\MyApp.exe", "Param1 Param2 Param3", ...)


Windows NT Behavior: 

If the first "parameter" in the CommandLine is not exactly the same as the ApplicationName string, then it replaces it before executing the application. For example if the ApplicationName and CommandLine parameters are as follows:
 
CreateProcess( "c:\\MyApp16.exe", "Param1 Param2 Param3", ...)


Это сообщение отредактировал(а) magesi - 23.6.2012, 13:53
PM MAIL   Вверх
EvilsInterrupt
Дата 23.6.2012, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



Цитата

что-то не понял насчет "--input-name" откуда дописывается, перечитаю еще раз msdn 

Я же пример ком. строки привел. Прям напрямую из своих сорцов
PM MAIL WWW ICQ Jabber   Вверх
magesi
Дата 23.6.2012, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 20.5.2012

Репутация: -4
Всего: -4



Цитата(EvilsInterrupt @ 23.6.2012,  14:00)
Цитата

что-то не понял насчет "--input-name" откуда дописывается, перечитаю еще раз msdn 

Я же пример ком. строки привел. Прям напрямую из своих сорцов

А это личный пример?

Меня что-то глюкнула мысль, что Вы имели в виду, что второй аргумент в CreateProcess() добавляет --input-name сам ))) пардон

но по этому по поводу, я уже отписался, что у меня не воракет еще в п. 1 стартового сообщения

Код

L"C:\\Program Files (x86)\\Lua\\lua52.exe C:\\1.lua


LUA не надо всяких инпут-неймов писать параметры явные, сразу имя файла
PM MAIL   Вверх
EvilsInterrupt
Дата 23.6.2012, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



Код

L"C:\\Program Files (x86)\\Lua\\lua52.exe C:\\1.lua"


Код

CreateProcessW( L"C:\\Program Files (x86)\\Lua\\lua52.exe, L"C:\\1.lua", ...)

PM MAIL WWW ICQ Jabber   Вверх
Randajad
Дата 23.6.2012, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: 8
Всего: 8



Попробуйте:

Код

BOOL status = CreateProcess(L"\"C:\\Program Files (x86)\\Lua\\lua52.exe\" file.lua",  
NULL, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi);

PM MAIL   Вверх
magesi
Дата 23.6.2012, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 20.5.2012

Репутация: -4
Всего: -4



Цитата(EvilsInterrupt @  23.6.2012,  15:07 Найти цитируемый пост)
код C++1:CreateProcessW( L"C:\\Program Files (x86)\\Lua\\lua52.exe, L"C:\\1.lua", ...)highlightSyntax('cpp_ZkNWZl','cpp');

пробывал это, увы... ( я кстати, это выше уже описывал smile )

он создает процесс с интерпретатором Lua, но не отдаем ему инструации на выполнение, да процесс создан но в output от Lua ничего.... ( ни ошибки, ни резалта ), просто выдается окно , которое вызывается, если просто Lua запустить

user posted image

Причем, если просто в сmd: lua52 C:\some.lua , то выдает резалт именно... :(

Кстати, на Шарпе у меня с этим проблем нет, но нужно именно на Сях сделать :(

Добавлено @ 15:14
Цитата(Randajad @ 23.6.2012,  15:09)
Попробуйте:

Код

BOOL status = CreateProcess(L"\"C:\\Program Files (x86)\\Lua\\lua52.exe\" file.lua",  
NULL, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi);

нет.... к сожалению даже в BOOL выдает 0 после такого... :( 

Это сообщение отредактировал(а) magesi - 23.6.2012, 15:18
PM MAIL   Вверх
Randajad
Дата 23.6.2012, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: 8
Всего: 8



Черт! Я перепутал аргументы же.

Код

BOOL status = CreateProcess(0, L"\"C:\\Program Files (x86)\\Lua\\lua52.exe\" file.lua", NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi);


Вот так будет работать.
PM MAIL   Вверх
magesi
  Дата 23.6.2012, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 20.5.2012

Репутация: -4
Всего: -4



Цитата(Randajad @ 23.6.2012,  15:17)
Черт! Я перепутал аргументы же.

Код

BOOL status = CreateProcess(0, L"\"C:\\Program Files (x86)\\Lua\\lua52.exe\" file.lua", NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi);


Вот так будет работать.

У меня на Ваш код вышло след.  smile 

user posted image

Добавлено через 7 минут и 38 секунд
Приведу-ка я полностью весь код и объясню, что делаю:

Код

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>

static FILE *fp;
static int result;
static long size;
static char *buffer;

static STARTUPINFO si;
static PROCESS_INFORMATION pi;

int kmp(char substr[], char str[])
{
    int i, j, N, M;

    N = strlen(str);
    M = strlen(substr);

    int *d = (int*)malloc(M * sizeof(int));
    d[0] = 0;

    for(i = 0, j = 0; i < M; i++)
    {
        while(j > 0 && substr[j] != substr[i])
        {
            j = d[j - 1];
        }

        if(substr[j] == str[i])
        {
            j++;
            d[i] = j;
        }
    }

    for(i = 0, j = 0; i < N; i++)
    {
        while(j > 0 && substr[j] != str[i])
        {
            j = d[j - 1];
        }

        if(substr[j] == str[i])
        {
            j++;
        }

        if(j == M)
        {
            free(d);
            return i - j + 1;
        }
    }

    free(d);

    return -1;
}

int main(void)
{
    fp = fopen("C:\\1.lua", "r");

    ZeroMemory(&si, sizeof(STARTUPINFO));

    if(fp != NULL)
    {
        result = fseek(fp, 0, SEEK_END);
        size = ftell(fp);
        rewind(fp);
    }

    buffer = (char*)malloc(size);

    result = fread(buffer, 1, size, fp);

    printf("%s\r\n", buffer);

    char ptrn_begin[] = "%lua%",
        ptrn_end[] = "%end%";

    int pos_b = kmp(ptrn_begin, buffer),
        pos_e = kmp(ptrn_end, buffer);

    int diff = pos_e - pos_b;
    char *n_buffer = (char*)malloc(diff);
    strncpy(n_buffer, buffer + sizeof(ptrn_begin) + pos_b, diff - sizeof(ptrn_end));

    BOOL status = CreateProcess(0, L"\"C:\\Program Files (x86)\\Lua\\lua52.exe\" C:\\1.lua", NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi);

    return 0;
}


Программа на lua ( внимание тэги <%lua% && %end%> к lua не относятся, это чисто свое уже! )
Код

<%lua%

oleg = { x = 0xa }

table.insert(oleg, y)

oleg.y = 5

print(oleg.y)

%end%>


Финальная цель, как Вы уже догадались, сделать веб-сервер , работающим с Lua, сейчас разбираюсь с парсингом html-страниц на сервере с lua кодом

т.е. будут такие inject'ы ( что-то на подобии )
Код

<h1><%lua% print("Hello Wolrd") %end%></h1>


Цель, отрезать из таких страниц, часть lua кода, отдавать на обработку lua интерпретатору, а потом полученный результат в буффр сунуть и отправить клиенту, вот такая цель
PM MAIL   Вверх
Randajad
Дата 23.6.2012, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: 8
Всего: 8



Бида. А если попробовать не уникодную версию? CreateProcessA.
У меня работает.
PM MAIL   Вверх
Randajad
Дата 23.6.2012, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: 8
Всего: 8



Кстати, pi обнулять тоже нужно, если не ошибаюсь.
PM MAIL   Вверх
Qu1nt
Дата 23.6.2012, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 1
Всего: 50



Цитата

The Unicode version of this function, CreateProcessW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0571 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.