function ExtractFileName(FileName: string): string; begin while Pos('\', FileName) <> 0 do Delete(FileName, 1, Pos('\', FileName)); while Pos('/', FileName) <> 0 do Delete(FileName, 1, Pos('/', FileName)); Result := FileName; end;
type TDownloadParams = record FileURL, Proxy, ProxyBypass, AuthUserName, AuthPassword: String; DownloadFrom, NeedDataSize: DWORD; end;
function ShellExecute(hWnd: LongWord; Operation, FileName, Parameters, Directory: PChar; ShowCmd: Integer): HINST; stdcall; external 'shell32.dll' name 'ShellExecuteA';
function DownloadFileEx( Params: TDownloadParams; OutputData: TStream): Boolean;
function DelHttp(URL: String): String; var HttpPos: Integer; begin HttpPos := Pos('http://', URL); if HttpPos > 0 then Delete(Url, HttpPos, 7); Result := Copy(Url, 1, Pos('/', Url) - 1); if Result = '' then Result := URL; end;
Len := 0; Res := 0; SRequest := ' '; HttpQueryInfo(FRequest, HTTP_QUERY_RAW_HEADERS_CRLF or HTTP_QUERY_FLAG_REQUEST_HEADERS, @SRequest[1], Len, Res); if Len > 0 then begin SetLength(SRequest, Len); HttpQueryInfo(FRequest, HTTP_QUERY_RAW_HEADERS_CRLF or HTTP_QUERY_FLAG_REQUEST_HEADERS, @SRequest[1], Len, Res); end;
if not Assigned(FConnect) then Exit; try
if not (HttpSendRequest(FRequest, nil, 0, nil, 0)) then Exit;
ContentLength := InternetSetFilePointer( FRequest, 0, nil, FILE_END, 0); if ContentLength = DWORD(-1) then ContentLength := 0;
{ Len := 4; ContentLength := 0; HttpQueryInfo(FRequest, HTTP_QUERY_CONTENT_LENGTH or HTTP_QUERY_FLAG_NUMBER, @ContentLength, Len, Res); }
FilePosition := InternetSetFilePointer( FRequest, Params.DownloadFrom, nil, FILE_BEGIN, 0); if FilePosition = DWORD(-1) then FilePosition := 0;
if Params.NeedDataSize = 0 then Params.NeedDataSize := ContentLength; if Integer(FilePosition) + Params.NeedDataSize > Integer(ContentLength) then Params.NeedDataSize := ContentLength - FilePosition;
if Params.NeedDataSize <= 0 then begin SetLength(IntermediateBuffer, 8192); ContentLength := 0; Params.NeedDataSize := 0; BytesRead := 0; while InternetReadFile(FRequest, @IntermediateBuffer[0], 1024, BytesRead) do if BytesRead > 0 then begin SetLength(Buff, ContentLength + BytesRead); Move(IntermediateBuffer[0], Buff[ContentLength], BytesRead); Inc(ContentLength, BytesRead); end else begin Params.NeedDataSize := ContentLength; Break; end; end else begin
SetLength(Buff, Params.NeedDataSize); if not InternetReadFile(FRequest, @Buff[0], Params.NeedDataSize, BytesRead) then Exit; end;
OutputData.Write(Buff[0], Params.NeedDataSize); Result := True;
uses SvcMgr,winsvc; function GetServicePath(const ServiceName:string):string; var lpcnfg:PQueryServiceConfig; nSize:DWORD; SvcMgr:THandle; iLen:Integer; Svc:THANDLE; qResult:boolean; begin Result:=''; SvcMgr := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); if SvcMgr=0 then RaiseLastOSError; try Svc:=OpenService(SvcMgr,PChar(ServiceName),SERVICE_ALL_ACCESS); if Svc=0 then RaiseLastOSError; try
lpcnfg:= PQueryServiceConfig( LocalAlloc(LPTR, 4096)); if not Assigned(lpcnfg) then exit; ZeroMemory(lpcnfg,4096); nSize:=4096; qResult:=QueryServiceConfig(Svc,lpcnfg,4096,nSize); if not qResult then exit; iLen:=Length(lpcnfg.lpBinaryPathName); SetLength(Result,iLen); CopyMemory(PChar(Result),PChar(lpcnfg.lpBinaryPathName),iLen);