Помощник
Здравствуйте, гость ( Вход | Регистрация )
|
|
11:02:2008, 22:28
|
|
Новенький ![]() Группа: Программист Сообщений: 12 Регистрация: 28:01:2008 Пользователь №: 15 040 Репутация: 0
|
Столкнулся с такой проблемой:
Не получается написать bat файл который бы смог автоматизировать (посылку серверу POST запроса) т.к в нижеприведенном коде требуется непосредственное взаимодействие пользователя с формой. Помогите составить код, скомпилировав который можно получить exe (который в свою очередь можно выполнить из CMD-> тем самым послав POST запрос). А вот код программки (которая с формой): Код unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdCustomTransparentProxy, IdSocks, IdHTTP, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, StdCtrls; type TForm2 = class(TForm) Button1: TButton; IdHTTP1: TIdHTTP; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; response :TStringList; POSTData: TStringList; implementation {$R *.dfm} procedure TForm2.Button1Click(Sender: TObject); begin POSTData := TStringList.create; POSTData.add('modem_log_st_poe=&hang_up_st_poe=Disconnect&message='); IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData); end; end. PS. Программка должна выполняться скрытно (без GUI) и её можно было запускать из командной строки. |
|
Сообщение
#1
|
|
![]() |
|
|
12:02:2008, 07:14
|
|
Продвинутый ![]() ![]() Группа: Программист Сообщений: 182 Регистрация: 15:09:2005 Из: г. Минск Пользователь №: 2 297 Специализация: Клиент-серверные приложения Репутация: 0
|
Сделать консольное приложение и пускать его ...
|
|
Сообщение
#2
|
|
|
|
12:02:2008, 07:26
|
|
============== ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 740 Регистрация: 11:01:2007 Пользователь №: 8 750 Специализация: specialist Репутация: 27
|
Цитата(aqwapaq @ 12:02:2008, 00:28 ) без GUI А тогда форма вам зачем? |
|
Сообщение
#3
|
|
|
|
12:02:2008, 08:23
|
|
Новенький ![]() Группа: Программист Сообщений: 12 Регистрация: 28:01:2008 Пользователь №: 15 040 Репутация: 0
|
Создал VCL. Удалил форму.
Почему не работает так составленный код? Код program Phttp5435; uses Forms, IdHTTP,IdComponent,SysUtils, IdBaseComponent; {$R *.res} var POSTData: TStringList; begin POSTData := TStringList.create; POSTData.add('modem_log_st_poe=&hang_up_st_poe=Disconnect&message='); IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData); end; end. 2. Создал консольное приложение Тоже не работает: Код program Project1;
{$APPTYPE CONSOLE} uses SysUtils, IdHTTP,IdComponent; var POSTData: TStringList; begin try {$R *.res} POSTData := TStringList.create; POSTData.add('modem_log_st_poe=&hang_up_st_poe=Disconnect&message='); IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData); except on E:Exception do Writeln(E.Classname, ': ', E.Message); end; end. |
|
Сообщение
#4
|
|
|
|
12:02:2008, 08:28
|
|
============== ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 740 Регистрация: 11:01:2007 Пользователь №: 8 750 Специализация: specialist Репутация: 27
|
Что значит не работает?
|
|
Сообщение
#5
|
|
|
|
12:02:2008, 08:43
|
|
Новенький ![]() Группа: Программист Сообщений: 12 Регистрация: 28:01:2008 Пользователь №: 15 040 Репутация: 0
|
Во втором случае:
[DCC Error] Project1.dpr(9): E2003 Undeclared identifier: 'TStringList' [DCC Error] Project1.dpr(15): E2066 Missing operator or semicolon [DCC Error] Project1.dpr(16): E2066 Missing operator or semicolon [DCC Error] Project1.dpr(17): E2003 Undeclared identifier: 'IdHTTP1' ->Как я понимаю надо обявить 'TStringList' и 'IdHTTP1' но в type и в var их не получается обявить 1. Код program Project1; {$APPTYPE CONSOLE} uses SysUtils, IdHTTP,IdComponent; type TStringList = class(TStrings); IdHTTP1: TIdHTTP; var POSTData: TStringList; begin try {$R *.res} POSTData := TStringList.create; POSTData.add('modem_log_st_poe=&hang_up_st_poe=Disconnect&message='); IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData); except on E:Exception do Writeln(E.Classname, ': ', E.Message); end; end. errors: [DCC Error] Project1.dpr(9): E2003 Undeclared identifier: 'TStrings' [DCC Error] Project1.dpr(10): E2029 '=' expected but ':' found [DCC Error] Project1.dpr(22): E2003 Undeclared identifier: 'add'\ [DCC Error] Project1.dpr(23): E2250 There is no overloaded version of 'Post' that can be called with these arguments 2. Код program Project1; {$APPTYPE CONSOLE} uses SysUtils, IdHTTP,IdComponent; var TStringList = class(TStrings); IdHTTP1: TIdHTTP; POSTData: TStringList; begin try {$R *.res} POSTData := TStringList.create; POSTData.add('modem_log_st_poe=&hang_up_st_poe=Disconnect&message='); IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData); except on E:Exception do Writeln(E.Classname, ': ', E.Message); end; end. errors: [DCC Error] Project1.dpr(9): E2029 ',' or ':' expected but '=' found [DCC Error] Project1.dpr(9): E2021 Class type required [DCC Error] Project1.dpr(11): E2007 Constant or type identifier expected [DCC Error] Project1.dpr(19): E2066 Missing operator or semicolon [DCC Error] Project1.dpr(20): E2250 There is no overloaded version of 'Post' that can be called with these arguments Где ошибка? |
|
Сообщение
#6
|
|
|
|
12:02:2008, 08:51
|
|
============== ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 740 Регистрация: 11:01:2007 Пользователь №: 8 750 Специализация: specialist Репутация: 27
|
кейворд uses вам знаком?
|
|
Сообщение
#7
|
|
|
|
12:02:2008, 09:03
|
|
Новенький ![]() Группа: Программист Сообщений: 12 Регистрация: 28:01:2008 Пользователь №: 15 040 Репутация: 0
|
Цитата(sax_ol @ 12:02:2008, 10:51 ) Вообщето знаком. Но причем он тут? Все что используется уже есть в uses(SysUtils, IdHTTP,IdComponent) Если вы о том, что переместить TStringList в uses то это тоже заканчивается ошибкой: [DCC Error] Project1.dpr(6): F1026 File not found: 'TStringList.dcu' Наверное чтото другое ожидает Dephi. Вот так вроде хорошо: uses classes |
|
Сообщение
#8
|
|
|
|
12:02:2008, 09:06
|
|
============== ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 740 Регистрация: 11:01:2007 Пользователь №: 8 750 Специализация: specialist Репутация: 27
|
Для: aqwapaq
Поставте курсор на TStringList, нажмите F1, откроется справка, под словом Unit найдете модуль, который надо добавить в uses. и т.д. |
|
Сообщение
#9
|
|
|
|
12:02:2008, 09:13
|
|
Новенький ![]() Группа: Программист Сообщений: 12 Регистрация: 28:01:2008 Пользователь №: 15 040 Репутация: 0
|
Цитата(sax_ol @ 12:02:2008, 11:06 ) Поставте курсор на TStringList, нажмите F1, откроется справка, под словом Unit найдете модуль, который надо добавить в uses. и т.д. Thx! после запуска: First chance exception at $7C812A7B. Exception class EAccessViolation with message 'Access violation at address 0043666C in module 'cscasc.exe'. Read of address 00000128'. Process cscasc.exe (10820) и подсвечена строка: IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData); Неужели консольное приложение не может корректно работать с Indy? Или Delphi ругается на другое? |
|
Сообщение
#10
|
|
|
|
12:02:2008, 09:19
|
|
============== ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 740 Регистрация: 11:01:2007 Пользователь №: 8 750 Специализация: specialist Репутация: 27
|
она вам говорит, что надо перед использование создать объект класса TIdHTTP, а сейчас у вас в переменной IdHTTP1 находится nil.
|
|
Сообщение
#11
|
|
|
|
12:02:2008, 09:32
|
|
Новенький ![]() Группа: Программист Сообщений: 12 Регистрация: 28:01:2008 Пользователь №: 15 040 Репутация: 0
|
type
TIdHTTP = class(TIdCustomHTTP); Вроде правильно объявил. Так почему же опять: First chance exception at $7C812A7B. Exception class EAccessViolation with message 'Access violation at address 0043666C in module 'cscasc.exe'. Read of address 0B89F39C'. Process cscasc.exe (2408) и подсветка все той же строки |
|
Сообщение
#12
|
|
|
|
12:02:2008, 09:35
|
|
============== ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 740 Регистрация: 11:01:2007 Пользователь №: 8 750 Специализация: specialist Репутация: 27
|
Цитата(aqwapaq @ 12:02:2008, 11:32 ) type TIdHTTP = class(TIdCustomHTTP); это ботва ее надо убрать. ну и тоже самое с TStringList = class(TStrings); вы знаете что такое создать объект (экземпляр) класса? |
|
Сообщение
#13
|
|
|
|
12:02:2008, 09:44
|
|
Новенький ![]() Группа: Программист Сообщений: 12 Регистрация: 28:01:2008 Пользователь №: 15 040 Репутация: 0
|
Цитата(sax_ol @ 12:02:2008, 11:35 ) это ботва ее надо убрать. ну и тоже самое с TStringList = class(TStrings); вы знаете что такое создать объект (экземпляр) класса? 1. Как тогда должен выглядеть код? Как и где обявлять? 2. Может и знаю- видел в исходниках, но лучшей идеи (ботвы=) ) чем TIdHTTP = class(TIdCustomHTTP); нет |
|
Сообщение
#14
|
|
|
|
12:02:2008, 09:48
|
|
============== ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 740 Регистрация: 11:01:2007 Пользователь №: 8 750 Специализация: specialist Репутация: 27
|
Цитата(aqwapaq @ 12:02:2008, 11:44 ) Как и где обявлять? Они УЖЕ "объявлены", повторите пост #9 и для TIdHTTP. Вам надо только правильно пользоваться УЖЕ готовым. Поэтому мой предыдущий вопрос остается в силе. |
|
Сообщение
#15
|
|
|
|
12:02:2008, 09:54
|
|
Новенький ![]() Группа: Программист Сообщений: 12 Регистрация: 28:01:2008 Пользователь №: 15 040 Репутация: 0
|
|
|
Сообщение
#16
|
|
|
|
12:02:2008, 10:17
|
|
============== ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 740 Регистрация: 11:01:2007 Пользователь №: 8 750 Специализация: specialist Репутация: 27
|
Меня может и не затруднит, но разве в этом кайф? Кайф в тогм чтобы понять самому, и написать правильно. Вот тогда с чувством глубокого удовлетворения, можно заявлять "Я КРУТ"
работаем с объектами: Код var
myStringList : TStringList; // объявляем переменную с именем myStringList типа TStringList // так как эта переменная имеет тип класса то она сразу-же инициализируется значением nil begin // т.е. тут myStringList = nil // собственно создаем объект myStringList := TStringList.Create; // а вот тут переменныя myStringList будет содержать указатель на объект (т.е. 4 байта) в памяти типа TStringList // и только после зоздания объекта мы можем полноценно пользоваться им и его ресурсами try myStringList.Add ........ // пользуемся, количество строк кода зависит, естественно, от конкретики finally // в конце работы (т.е. тогда когда он уже не неужен) обязательно надо уничтожить объект, и тем самым освободить ресурсы занимаемые им. myStringList.Free; // "занилить" переменную, во избежание непоняток в случае если мы собираемся дальше ею пользоваться myStringList := nill; end; end; |
|
Сообщение
#17
|
|
|
|
12:02:2008, 10:59
|
|
Новенький ![]() Группа: Программист Сообщений: 12 Регистрация: 28:01:2008 Пользователь №: 15 040 Репутация: 0
|
На самом деле статьи, FAQ и Manual'ы по созданию объектов я читал не раз. Однако не применял на практике поэтому было интерестно увидеть правильный вариант, а не перелистывать бессмысленно груду "макулатуры". Спасибо за объяснение- теперь запускается без ошибок.
Только один большой нюанс- Post requet так и не отправляется при запуске/исполнении программы. Чем такое может быть вызвано? Разве при старте не инициализируется функция запроса? PS. Нужен ли в консольных приложениях TYPE? Если да, то для чего? Вот получившийся код: Код program cscasc; {$APPTYPE CONSOLE} uses SysUtils, IdHTTP, IdComponent, classes; // type //TIdHTTP = class(TIdCustomHTTP); var IdHTTP1: TIdHTTP; POSTData: TStringList; begin POSTData := TStringList.Create; //IdHTTP1:= IdHTTP; try {$R *.res} POSTData.add('modem_log_st_poe=&hang_up_st_poe=Disconnect&message='); IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData); finally POSTData.Free; end; end. Такой ERROR: [DCC Warning] cscasc.dpr(25): W1036 Variable 'IdHTTP1' might not have been initialized |
|
Сообщение
#18
|
|
|
|
12:02:2008, 11:06
|
|
============== ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 740 Регистрация: 11:01:2007 Пользователь №: 8 750 Специализация: specialist Репутация: 27
|
Все что я написал для myStringList также справедливо для всех остальных без исключения, не взирая на их названия и т.д.
Цитата(aqwapaq @ 12:02:2008, 12:59 ) Нужен ли в консольных приложениях TYPE? Если да, то для чего? Ровна для того-же, для чего он нужен и в не консольных, без каких либо оговорок. |
|
Сообщение
#19
|
|
|
|
12:02:2008, 11:10
|
|
Новенький ![]() Группа: Программист Сообщений: 12 Регистрация: 28:01:2008 Пользователь №: 15 040 Репутация: 0
|
Так где ошибка или в чем проблема? Почему переменная 'IdHTTP1' не запускается-> следственно не выполняется нужная функция?
|
|
Сообщение
#20
|
|
|
|
12:02:2008, 11:17
|
|
============== ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 740 Регистрация: 11:01:2007 Пользователь №: 8 750 Специализация: specialist Репутация: 27
|
Т.к. ее тоже надо инициализировать предварительно созданным объектом, т.е. все в соответствии с правилами, см выше.
Почему вы все сделали для POSTData, а для IdHTTP1 нет, в чем она провинилась? |
|
Сообщение
#21
|
|
|
|
12:02:2008, 11:32
|
|
Новенький ![]() Группа: Программист Сообщений: 12 Регистрация: 28:01:2008 Пользователь №: 15 040 Репутация: 0
|
Все работает хорошо!
Большое спасибо за урок и мой респект sax_ol!!!=) Вот работоспособный код: Код program cscasc; {$APPTYPE CONSOLE} uses SysUtils, IdHTTP, IdComponent, classes; var IdHTTP1: TIdHTTP; POSTData: TStringList; begin POSTData := TStringList.Create; IdHTTP1:= TIdHTTP.Create(nil); //IdHTTP1:= IdHTTP; try {$R *.res} POSTData.add('modem_log_st_poe=&hang_up_st_poe=Disconnect&message='); IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData); finally POSTData.Free; IdHTTP1.Free; end; end. PS. В изучении любой науки практика для меня важнее всего |
|
Сообщение
#22
|
|
|
|
12:02:2008, 15:32
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 899 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 11
|
Для: aqwapaq
Хм..., странный метод изучения. Так у тебя долго не получится, ровно на столько - на сколько хватит терпения у участников форума, а оно не безгранично, имхо. З.Ы. Тут есть еще один практик - Дима Ламо. Чтойто он затих. |
|
Сообщение
#23
|
|