Возвратить результат выполнения программы

Для неординарных вопросов. Если вы опытный программист, попавший в трудную ситуацию, — вам сюда.

Модератор: gaidar

Правила форума
Этот раздел не предназначен для того, чтобы вы адресовали свою проблему профессионалам.
Этот раздел предназначен для профессионалов, которые столкнулись с проблемой и не могут решить ее самостоятельно.
Если вы считаете себя профессионалом, а свою проблему сложной — вам сюда.
Если модератор посчитает, что вы ошиблись, то на первый раз он перенесет ваше сообщение в основной раздел без последствий для автора. Во второй раз тема будет закрыта, а автору будет выписано нарушение. В третий раз автор будет забанен.
d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Возвратить результат выполнения программы

Сообщение d3drm » 21.07.2008 (Пн) 14:52

Добрый день, господа уважаемые.

Такой вот вопрос сегодня возник. Пишется утилита для распечатывания стикеров (маленьких наклеек на конверты) на VB. Ее задача - тупо распечатать переданный текст в нужном формате на нужном принтере. Программа вызывается через функцию exec php скрипта.

Задача - заставить программу выплюнуть в скрипт результат выполнения. Хоть 1 байт информации - удалось или нет? Подскажите, пожалуйста =)
ХЎ

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 21.07.2008 (Пн) 17:11

Ага,WriteFile + GetStdHandle STD_OUTPUT_HANDLE
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Сообщение Proxy » 21.07.2008 (Пн) 18:41

А не прибегая к файлу как? (я не сталкивался с ПХП вообще никогда)
Follow the white rabbit.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 21.07.2008 (Пн) 19:25

Вообще-то это как раз и есть "не прибегая к файлу"
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Сообщение Proxy » 21.07.2008 (Пн) 20:06

Ого.
Follow the white rabbit.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.07.2008 (Пн) 21:21

А ещё, кажется, потребуется править PE-header.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 21.07.2008 (Пн) 21:36

Тебе лишь бы чтото поправить. Ничего не придется
Кстати, дорогой мой, может ты поправишь хотя бы тот модуль который отправляет через SMTP что бы он не выводил ошибки а просто писал их в лог? А еще лучше переведи с mail.ru на скажем google mail
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.07.2008 (Пн) 23:05

ANDLL
Ты ошибаешься. Я бы рад ничего не править. Я всё-таки решил проверить:

  • Я сделал exe-шник из следующего кода:
    Код: Выделить всё
    Private Const STD_OUTPUT_HANDLE = -11&
    Private Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long
    Private Declare Function WriteConsole Lib "kernel32" Alias "WriteConsoleA" (ByVal hConsoleOutput As Long, lpBuffer As Any, ByVal nNumberOfCharsToWrite As Long, lpNumberOfCharsWritten As Long, lpReserved As Any) As Long
    Private Declare Function AllocConsole Lib "kernel32" () As Long

    Public Sub Main()
        Dim x As String
        Dim n As Long
        x = "Hello Word!"
        n = Len(x)
        WriteConsole GetStdHandle(STD_OUTPUT_HANDLE), ByVal x, n, n, ByVal 0&
        MsgBox Err.LastDllError
    End Sub

    и запустил его. Получил ошибку 6 (Неверный дескриптор).
  • Я запустил его (exe-шник) из-под cmd.exe -- и схавал ту же ошибку.
  • Я сделал в самом начале вызов AllocConsole, перекомпилировал EXE-шник и запустил его: Ошибки небыло, нужный текст отобразился в консоли.
  • Я запустил exe-шник из-под cmd.exe -- при этом создалась новая консоль.
  • Убрал вызов AllocConsole и таки поправил поле в PE-хеадере Subsystem c GUI на CUI (чтобы виндовый загрузчик аллочил консоль для нового процесса сразу же при загрузке): после этого, exe-шник стал работать как полагается.

Кажется, всё-таки, я прав?

А еще лучше переведи с mail.ru на скажем google mail

Знаешь ли, там отправка осуществляется через SSL. phpBB так не умеет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 22.07.2008 (Вт) 10:12

со всем что написано выше разобрался - в консоли файл выводит hello, word, но в функцию exec в пхп ничего не передается... Хакер, есть мысли какие-нибудь?


*UPD*
Из консоли программа работает нормально, из ехес'а выдает 6ую ошибку...
ХЎ

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 22.07.2008 (Вт) 11:51

Кажется, всё-таки, я прав?
По приведенным пунктам - да. В главном - нет.
Раз d3 получает ответ в php, значит php сам создает трубу и передает ее в createprocess, иначе он никак не смог бы прочитать что вернула программа, верно?
Флажок sub system и наличие консоли у порождающего процесса имеет смысл, когда "мануальные трубы" в createprocess выставлены в null.
Во всех твоих случаях они выставлены в null, вот ты и видишь разницу.
Если вызывающая программа передает трубу, то именно ее вернет GetStdHandle, вне зависимости от флажков в заголовках. И писать в нее нужно через WriteFile, а не WriteConsole
Из консоли программа работает нормально, из ехес'а выдает 6ую ошибку..
Соответственно замени writeconsole на writefile
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 22.07.2008 (Вт) 12:13

Только собирался написать тут что проблема решилась заменой WriteConsole на WriteFile, как тут это сообщение =)

В общем все решилось, выражаю огромное спасибо пользователям Хакер, ANDLL, Proxy (первым двум за помощь в решении, последнему - за участие :) )

Вывод таков (обобщим):

для того, чтобы php скрипт мог читать выходные данные из программы на VB код должен выглядеть примерно следующи образом:

Код: Выделить всё
Private Const STD_OUTPUT_HANDLE = -11&

Private Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long
Public Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Any) As Long



Public Sub Main()
    Dim x As String
    Dim n As Long
    x = "Hello Word!"
    n = Len(x)
    Dim nn As Long

    WriteFile GetStdHandle(STD_OUTPUT_HANDLE), ByVal x, n, nn, ByVal 0&

    MsgBox Err.LastDllError
End Sub


После этого следует задействовать какую-нибудь утилитку и сменить PE заголовок, без этого не работает - проверял. Сам использовал PE Tools v1.3 by NEOx.

Ну и в php обыкновенный ехес, данные выводятся в result и в массив out.
ХЎ


Вернуться в Раздел для Профессионалов

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList