Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Tcurl и потоки


Автор: vetalkov 7.9.2011, 11:08
Ребята подскажите пожалуйста как загнать содержимое сайта в переменную а не в файл.
Код

procedure CurlPost;
var
  Curl: TCurl;
begin
  Curl := TCurl.Create(nil);
  Curl.URL := Self.url;
  Curl.HttpHeader.Add('User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.20) Gecko/20110803 Firefox/3.6.20 GTB7.1 ( .NET CLR 3.5.30729; .NET4.0E)');
  Curl.HttpHeader.Add('Accept: image/png,image/*;q=0.8,*/*;q=0.5');
  Curl.HttpHeader.Add('Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3');
  Curl.HttpHeader.Add('Accept-Encoding: deflate');
  Curl.HttpHeader.Add('Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7');
  Curl.HttpHeader.Add('Keep-Alive: 5');
  Curl.HttpHeader.Add('Connection: keep-alive');
  if Self.Refferer = '' then Curl.HttpHeader.Add('Referer: '+ Self.url) else Curl.HttpHeader.Add('Referer: '+Self.Refferer);
  if Self.data <> '' then Curl.PostFields := Self.data;
 
  Curl.CookieFile := Self.CookieFile;
  Curl.OutputFile := 'TempFile.html'; // вот здесь результат GET/POST запроса записывается в файл.
 // хотя может по идее быть передан в Curl.OutputStream := в переменную
 
  if not Curl.Perform then
  begin
    Self.ResultSendData := false;
  end
     else Self.ResultSendData := true;
 
  Curl.Free;
end;
 


пробовал так

Код

var
  buf:TMemoryStream;
.....
 
 buf := TMemoryStream.Create;
 Curl.OutputStream := buf;
Memo1.Lines.LoadFromStream(buf);
 
// выдает ошибку access violation



помогите разобраться плиз

Автор: kami 7.9.2011, 12:25
Код

buf := TMemoryStream.Create; 
Curl.OutputStream := buf;
[U]buf.Seek(0, soBeginning);[/U]
Memo1.Lines.LoadFromStream(buf);

Кстати, это только одна из ошибок. Не работал с этим CURL, посему остальные подсказать не могу.

Автор: AndreyIQ 7.9.2011, 12:35
Цитата(kami @ 7.9.2011,  12:25)
Код

buf := TMemoryStream.Create; 
Curl.OutputStream := buf;
[U]buf.Seek(0, soBeginning);[/U]
Memo1.Lines.LoadFromStream(buf);

Кстати, это только одна из ошибок. Не работал с этим CURL, посему остальные подсказать не могу.

У него повидимому не в это ошибка, потому что Memo1.Lines.LoadFromStream(buf); без проблем читает без  установки позиции, просто Memo1 пустой будет и ошибки не выдаст.

Автор: MetalFan 7.9.2011, 14:17
что за TCURL такой? где на него посмотреть? может OutputStream внутри объекта создается?

Автор: vetalkov 7.9.2011, 21:31
Цитата(MetalFan @ 7.9.2011,  14:17)
что за TCURL такой? где на него посмотреть? может OutputStream внутри объекта создается?

вот тут 
http://curl.haxx.se/libcurl/pascal/
http://curlpas.sourceforge.net/doc/

Автор: AndreyIQ 8.9.2011, 10:32
Цитата(vetalkov @ 7.9.2011,  21:31)
Цитата(MetalFan @ 7.9.2011,  14:17)
что за TCURL такой? где на него посмотреть? может OutputStream внутри объекта создается?

вот тут 
http://curl.haxx.se/libcurl/pascal/
http://curlpas.sourceforge.net/doc/

Цитата

OutputStream: pointer   - See   tCurl.WriteFunction
....
HeaderFunction: curl_write_callback
 Function pointer that should match the following prototype: 
...
 type tCurlHeaderFunction = 
  function(ptr: pChar; size, nmemb:dword; stream:pointer):dword; cdecl; 
...
 This function gets called as soon as there is received header data that needs to be written down. 
 The headers are guaranteed to be written one-by-one and only complete lines are written. 
 Parsing headers should be easy enough using this. 
 The size of the data pointed to by ptr is ( size * nmemb ). 
 The pointer named stream will be the one you set with the tCurl.HeaderStream property.
 Return the number of bytes actually written or return zero to signal an error to the library 
 (it will cause it to abort the transfer with a CURLE_WRITE_ERROR return code).



Автор: MetalFan 8.9.2011, 11:36
ясно. OuputStream - это указатель на callback функцию, а не на поток... отлично назвали) логично и понятно.

Автор: kami 8.9.2011, 12:41
Цитата(MetalFan @  8.9.2011,  11:36 Найти цитируемый пост)
OuputStream - это указатель на callback функцию, а не на поток... отлично назвали

Назвали, конечно, здорово.
Только OutputStream - это (имхо) не callback функция, а ее параметр stream: pointer

Автор: MetalFan 8.9.2011, 15:52
kami, согласен. невнимательно прочитал) назначаем функцию WriteFunction, в нее будет передан указатель OutputStream... я так понял.
http://curlpas.sourceforge.net/demo/testcb.pas.html а http://curlpas.sourceforge.net/doc/examples.html
а вообще, зачем этот изврат с TCURL? есть же более простые в использовании библиотеки.... тот же synapse

Автор: vetalkov 9.9.2011, 20:25
Цитата(MetalFan @ 8.9.2011,  15:52)
kami, согласен. невнимательно прочитал) назначаем функцию WriteFunction, в нее будет передан указатель OutputStream... я так понял.
http://curlpas.sourceforge.net/demo/testcb.pas.html а http://curlpas.sourceforge.net/doc/examples.html
а вообще, зачем этот изврат с TCURL? есть же более простые в использовании библиотеки.... тот же synapse

решил писать используя synapse ))

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