PDA

View Full Version : دریافت کد پیج صفحه اینترنتی ...



Hamid_PaK
پنج شنبه 21 دی 1385, 21:50 عصر
نیاز دارم که با یک روش ساده و سبک محتوای صفحات اینترنتی رو دریافت کنم !!!

نکته : چون این عمل باید در هر 5 ثانیه و یا کمتر صورت بگیرد باید بسیار سبک و سریع باشد ...
با INDY کار کردم جواب می ده ولی با اجرای پشت سر هم درچار مشکل می شه !!!


function GetUrlCodePage( const url_addr: String; var rslt: String ): Boolean;
var
http: TIdHTTP;
begin
//;
Result := True;
http := TIdHTTP.Create( nil );
try
try
rslt := http.Get( url_addr );
except
on e: Exception do begin
Result := False;
rslt := e.Message;
end;
end;
finally
http.Free;
end;
end;


با تشکر ، یا حق ...

vcldeveloper
جمعه 22 دی 1385, 10:09 صبح
دریافت کد پیج صفحه اینترنتی ...
IdHTTP1.Response.ContentEncoding

Hamid_PaK
جمعه 22 دی 1385, 13:44 عصر
نه حاج علی منظورم رو درست بیان نکردم ، کد صفحه دریافت می شود ولی همانطور که گفتم ...

این عمل باید در هر 5 ثانیه و یا کمتر صورت بگیرد
کد عمل می کنه و محتویات صفحه دریافت می شه ولی
تابعی که در بالا نوشتم فقط یک بار کار می کند و در ادامه خطای Access Violation ظاهر میشه ...

با تشکر ، یا حق ...

Hamid_PaK
شنبه 23 دی 1385, 16:15 عصر
از CriticalSection استفاده کن ببین مشکلت حل میشه ...

یک چیزی اینجوری

var
CS: TCriticalSection;

توی Oncreate form
cs:= TCritialSection.Create;



Result := True;
CS.Enter;
try
http := TIdHTTP.Create( nil );
try
try
rslt := http.Get( url_addr );
except
on e: Exception do begin
Result := False;
rslt := e.Message;
end;
end;
finally
http.Free;
end;
finally
CS.Leave;
end;;

یونیت syncObjs رو use کن

------------------------------------- نوشته شده توسط ghabil

Hamid_PaK
شنبه 23 دی 1385, 16:21 عصر
با روش آقای ghabil مشکل حل شد ولی متاسفانه من نیاز دارم که این تابع رو در یک کتابخانه قرار دهم پس ...




var
CS: TCriticalSection;

توی Oncreate form
cs:= TCritialSection.Create

منتفی است !!!

با تشکر ، لطفا کمک کنید ، یا حق ...

Hamid_PaK
شنبه 23 دی 1385, 16:28 عصر
خیلی جالب بود من تابع مورد نظر


function GetUrlCodePage( const url_addr: String; var rslt: String ): Boolean;
var
http: TIdHTTP;
begin
//;
Result := True;
http := TIdHTTP.Create( nil );
try
try
rslt := http.Get( url_addr );
except
on e: Exception do begin
Result := False;
rslt := e.Message;
end;
end;
finally
http.Free;
end;
end;

رو در یک Application معمولی که اجرا می کنم خطای Access Violation ظاهر نمی شود.
ولی هنگامی که تابع در کتابخانه قرار می گیرد خطا ظاهر می شود ، چرا ؟؟؟
امکان داره هنگام فراخوانی مشکل ایجاد بشه ؟؟؟

یا حق ...

ghabil
شنبه 23 دی 1385, 22:14 عصر
اگر توی Application هم بدون CriticalSection مشکل داری و با گذاشتنش مشکلت حل میشه ، خب توی DLLت CreateSemaphore کن، اما اگر مشکل نداری و وقتی تابع رو میزاری توی یک DLL دیگه به این مشکل میخوری تقریبا میتونم بگم 95 درصد مشکلت با Memory Manegment هست ، بخصوص که داری STRING رو بصورت Refrenceپاس میکنی. اگر اینطوری برو دنبال داستان ShareMem .

joker
یک شنبه 24 دی 1385, 00:09 صبح
ببین مشکلت حل میشه :
البته فکر نکنم روی دلفی های مدل بالا کار بده :) دلفی 5- 6 چون clientsocket1
ولی با یه کم تغییر توی سوکت پروگرامینگ مشکلت حله ...
در ضمن هر اگه میخوای هر 5 ثانیه یکبار صفحه بگیره باید به این نکته هم توجه داشته باشی که درخواست قبلیت تو این مدت کامل پردازش شده باشه ( سرعت پائین اینترنت یا حجیم بودن صفحه )


PROCEDURE DFFW(strHost,strremotefilename,strlocalfilename:
string;clientsocket:Tclientsocket);
//
//
// DFFW= ('www.ordibehehst.net' , '/test.htm' , 'C:\downlaod\test.htm' , clientsocket1);
//
//
//
var
intReturnCode:integer ;
s:string;
szBuffer:array[0..128] of char ;
fileout:TFileStream ;
begin
if strRemoteFilename[1] <> '/' then
strremotefilename := '/'+strremotefilename ;
fileout := TFileStream.Create(strlocalfilename,fmCreate);
try
with clientsocket do
begin
host:= strhost ;
clientType := ctBlocking ;
port := 80 ;
try
open ;
s:= 'GET '+strRemoteFilename+' HTTP/1.0'+#13#10+'Host: ' + strhost+#13#10#13#10 ;

intReturnCode := socket.sendbuf(pointer(s)^,Length(s));

if intReturncode > 0 then
begin
while (intReturnCode > 0 ) do
begin
fillchar(szBuffer,sizeof(szBuffer),0);
intReturnCode := socket.ReceiveBuf(szbuffer,sizeof(szbuffer));
if intReturnCode > 0 then
fileOut.Write(szBuffer,intReturnCode);
end
end
else
MessageDlg('No answer From Server ', mtError,[mbOK],0);
close;
except
messageDLg('No Connection ', mtError ,[mbOK],0);
end;
end;
finally ;
fileout.free;
end;
end;
// ===

Hamid_PaK
یک شنبه 24 دی 1385, 16:44 عصر
با یونیت Socket و کامپوننت TTcpClient مشکل حل شد ...

یا حق ...

Hamid_PaK
یک شنبه 24 دی 1385, 21:11 عصر
دیگه خسته شدم هر کاری کردم که با این pChar از کتابخانه اطلاعات رو ارسال کنم نشد !!!
مثال های استفاده از pChar رو هم نگاه کردم ولی جواب نگرفتم ...
Access Violation پشت سر هم !!!

کسی یک نمونه ارسال String به آرگومان و یا نتیجه تابع که از نوع pChar باشه داره ؟؟؟

با تشکر ، یا حق ...

Hamid_PaK
یک شنبه 24 دی 1385, 21:20 عصر
تابع GetWindowText چطوری کار می کنه که نتیجه در PChar ذخیره می شود ؟؟؟

یا حق ...

Hamid_PaK
یک شنبه 24 دی 1385, 21:25 عصر
مزخرف : حافظه ی کمی درخواست کرده بودم به همین دلیل کل کد در حافظه مورد نظر جای نمی گرفت ...

یا حق ...

vcldeveloper
سه شنبه 26 دی 1385, 09:23 صبح
داده های نوع string رو می تونید به راحتی به PChar تایپ کست (TypeCast) کنید:


var
MyStr : string;
TextLength : integer;
begin
TextLength := GetWindowTextLength(Handle) + 1;
//Allocate memory for the buffer
SetLength(MyStr,TextLength);
//Save window text in the buffer.
GetWindowText(Handle,PAnsiChar(MyStr),TextLength);
ShowMessage(Trim(MyStr));
end;