powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / http
16 сообщений из 16, страница 1 из 1
http
    #33489040
Геннадич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь скачать в скрипте из интернета ничего не выходит. Указатели lul_iopen, lul_inetconn, lul_httpreq получаю, а вот httpsendrequest получаю FALSE. Может чего не так делаю? Знающие люди отзовитесь.
Вот скрипт
:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
string ls_myapp, ls_null, ls_addr, ls_user, ls_passw, ls_file, ls_locpath, ls_p
ulong lul_res, lul_inetconn, lul_iopen, lul_flag, lul_cont, ll,lul, lul_httpreq, ll_err
boolean lb_flag
string ls_buff, ls_get, ls_acctype[]
n_cst_wininet l_inet


ls_buff = fill('0',  1000000 )
ls_myapp = "my app"
SetNull(ls_null)
ls_addr = "http://www.microsoft.com/library/toolbar/3.0/sitemap/ru-ru.mspx"
ls_user = ''
ls_passw = ''
lul_flag =  0 
lul_cont =  0 
ls_file = 'ru-ru.mspx'
lb_flag = false
ls_p = ""
ls_get = 'GET'

lul_iopen = l_inet.uf_internetopen( ls_myapp, l_inet.INTERNET_OPEN_TYPE_PRECONFIG, ls_null, ls_null,  0 )

lul_inetconn = l_inet.uf_internetconnect( lul_iopen, ls_addr,  0 , ls_user, ls_passw, l_inet.internet_service_http, lul_flag, lul_cont)

lul_httpreq = l_inet.uf_httpopenrequest( lul_inetconn, ls_get, ls_file, ls_addr, ls_p, ls_acctype,  2147483648 , lul_cont)
//указатели получены
lb_flag = l_inet.uf_httpsendrequest( lul_httpreq,ls_null, 0 , ls_null, 0 )
//получить данные в буфер
lb_flag = l_inet.uf_internetreadfile(lul_httpreq, ls_buff,  100000 , lul)
//закрыть
l_inet.uf_internetclosehandle( lul_httpreq)
l_inet.uf_internetclosehandle( lul_inetconn )
l_inet.uf_internetclosehandle( lul_iopen )
объект с обявлением winnet в приложенном файле
...
Рейтинг: 0 / 0
http
    #33489464
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эту библиотеку не пользовал

вот работающий пример на C:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
bool getHttpFile(char*URL,FILE*dst){
	
	bool ret=false;
	HINTERNET hInternet=NULL;
	HINTERNET hURL=NULL;
	DWORD dwFlags= 0 ;
	char buf[ 1024 ];
	DWORD dwRead= 0 ;
	
	hInternet = InternetOpen("WinInetGet/0.1",	INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL,  0 );
	if(!hInternet)goto err;
	
	dwFlags=INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |
			INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS |
			INTERNET_FLAG_NO_AUTH |
			INTERNET_FLAG_NO_CACHE_WRITE |
			INTERNET_FLAG_NO_COOKIES |
			INTERNET_FLAG_NO_UI |
			INTERNET_FLAG_RELOAD;
	hURL = InternetOpenUrl(hInternet,URL,"", 0 ,dwFlags, NULL);
	if(!hURL)goto err;
	
	dwRead=sizeof(buf);
	if(!HttpQueryInfo(hURL, HTTP_QUERY_STATUS_CODE, buf, &dwRead, NULL))goto err;
	if(atol(buf)!=HTTP_STATUS_OK){
		//printf("bad return code %s\n",buf);
		goto err;
	}
		
	while(InternetReadFile(hURL, buf, sizeof(buf), &dwRead) && dwRead> 0 ){
		fwrite( buf,dwRead, 1 ,dst );
	}
	
	ret=true;
	err:
	if(hURL)InternetCloseHandle(hURL);
	if(hInternet)InternetCloseHandle(hInternet);
	return ret;
}
...
Рейтинг: 0 / 0
http
    #33490681
Геннадич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Dmitry.
Здесь не получаю ссылки (возвращает 0):
Код: plaintext
1.
lul_inetconn  = l_inet.uf_internetopenurl(lul_iopen, ls_addr, ls_null,  0 , [src]l_inet.INTERNET_FLAG_NO_AUTH, lul_cont)
аргументы:
Код: plaintext
1.
2.
3.
lul_iopen = сыылка от internetopen
ls_addr = "http://www.microsoft.com/library/toolbar/3.0/sitemap/ru-ru.mspx"
ls_null = null
lul_cont =  0 
Что я не так?
...
Рейтинг: 0 / 0
http
    #33491509
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To get extended error information, call GetLastError.
To determine why access to the service was denied, call InternetGetLastResponseInfo.
...
Рейтинг: 0 / 0
http
    #33491600
Геннадич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry.To get extended error information, call GetLastError.
To determine why access to the service was denied, call InternetGetLastResponseInfo.
GetLastError возвращает 0
...
Рейтинг: 0 / 0
http
    #33491645
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а InternetGetLastResponseInfo?
...
Рейтинг: 0 / 0
http
    #33493217
Геннадич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InternetGetLastResponseInfo тоже 0
...
Рейтинг: 0 / 0
http
    #33493273
Andyn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Геннадич , вам принципиально пользоваться этой библиотекой? Если надо просто страничку в интрасети скачать, есть другой способ.
...
Рейтинг: 0 / 0
http
    #33493342
Геннадич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andyn Геннадич , вам принципиально пользоваться этой библиотекой? Если надо просто страничку в интрасети скачать, есть другой способ.
Мне надо файлик скачать(фтп не предлагать). Какой способ, не поделитесь?
...
Рейтинг: 0 / 0
http
    #33493515
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На всяк случай.
в вашем обьекте:

Код: plaintext
1.
2.
3.
Public Function ulong uf_InternetGetLastResponseInfo (ref ulong lpdwError, ref string lpszBuffer, ref ulong lpdwBufferLength);
Return(InternetGetLastResponseInfo(lpdwError, lpszBuffer, lpdwBufferLength))
end function

это значит что перед вызовом ф-ции надо-бы инициализировать буфер примерно так:

Код: plaintext
1.
2.
3.
4.
string errText
ulong i, dwErr, dwErrSize= 1000 
errText=space(dwErrSize)
i=l_inet.uf_InternetGetLastResponseInfo(dwErr, errText, dwErrSize)
if i<> 0  then MessageBox('wininet error',errText)
...
Рейтинг: 0 / 0
http
    #33493822
Геннадич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry.На всяк случай.
в вашем обьекте:

Код: plaintext
1.
2.
3.
Public Function ulong uf_InternetGetLastResponseInfo (ref ulong lpdwError, ref string lpszBuffer, ref ulong lpdwBufferLength);
Return(InternetGetLastResponseInfo(lpdwError, lpszBuffer, lpdwBufferLength))
end function

это значит что перед вызовом ф-ции надо-бы инициализировать буфер примерно так:

Код: plaintext
1.
2.
3.
4.
string errText
ulong i, dwErr, dwErrSize= 1000 
errText=space(dwErrSize)
i=l_inet.uf_InternetGetLastResponseInfo(dwErr, errText, dwErrSize)
if i<> 0  then MessageBox('wininet error',errText)

Я её так иницализил:
Код: plaintext
ls_buff = fill('0',  1000 )
К стати, сама uf_InternetGetLastResponseInfo возвращаеи 1, а вот реф аргумент первый - 0, второй - пустую строку.

2Andyn:
Так что там про другой способ?
...
Рейтинг: 0 / 0
http
    #33493887
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а в третий параметр перед вызовом ты занес размер буфера? т.е. 1000?
...
Рейтинг: 0 / 0
http
    #33493909
Геннадич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Dmitry.
Конечно!
...
Рейтинг: 0 / 0
http
    #33495401
Andyn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Геннадич , я не вполне уверен, что вам это подойдет, поскольку у нас задача была немного другая, но тем не менее, в упрощенном виде это так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
inet li_inet
nv_internetresult lnv_res
string ls_res

// Создать объект для обработки ответа сервера
lnv_res = create nv_internetresult

// Получить ссылку на сервис интернет
GetContextService("Internet", li_inet)

// Вызвать URL
li_inet.GetURL("http://192.168.1.1/some_info.htm", lnv_res)

// Получить результат обработки ответа сервера
ls_res = lnv_res.is_out

Объект, унаследованный от internetresult:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
forward
global type nv_internetresult from internetresult
end type
end forward

global type nv_internetresult from internetresult
end type
global nv_internetresult nv_internetresult

type variables
string is_out
end variables
forward prototypes
public function integer internetdata (blob data)
end prototypes

public function integer internetdata (blob data);string ls_res

ls_res = string(data, EncodingANSI!)

this.is_out = ls_res

return  1 
end function

on nv_internetresult.create
call super::create
TriggerEvent( this, "constructor" )
end on

on nv_internetresult.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on

В функции internetdata , переопределяемой в этом объекте, выполняется преобразование blob, в который возвращается ответ сервера в string (поскольку так требуется), вам просто можно смотреть на заголовки, если они там есть, отрезать их и остаток сохранять в файл. Версия PB 10.2.0.7516
...
Рейтинг: 0 / 0
http
    #33496615
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял!!!!

ты пользуешь ЗИ 10 (юникод) !!!
а библиотеку взял от ранних версий!
там все ф-ции у которых параметром строка пбьявлены как неюникодовские
пример:
InternetOpenUrl (ulong hInternet, ref string lpszUrl, ref string lpszHeaders, ulong dwHeadersLength, ulong dwFlags, ref ulong dwContext) Library "WININET.DLL" Alias for "InternetOpenUrlA"

и нет обрамления для работы с ансишной ф-цией!
(PB делает при миграции библиотек: Alias for "InternetOpenUrlA;Ansi" )

Но правильнее всего переделать все обьявления на юникод:
InternetOpenUrl (ulong hInternet, ref string lpszUrl, ref string lpszHeaders, ulong dwHeadersLength, ulong dwFlags, ref ulong dwContext) Library "WININET.DLL" Alias for "InternetOpenUrl W "
...
Рейтинг: 0 / 0
http
    #33497196
Геннадич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry.Я понял!!!!

ты пользуешь ЗИ 10 (юникод) !!!
а библиотеку взял от ранних версий!
там все ф-ции у которых параметром строка пбьявлены как неюникодовские
пример:
InternetOpenUrl (ulong hInternet, ref string lpszUrl, ref string lpszHeaders, ulong dwHeadersLength, ulong dwFlags, ref ulong dwContext) Library "WININET.DLL" Alias for "InternetOpenUrlA"

и нет обрамления для работы с ансишной ф-цией!
(PB делает при миграции библиотек: Alias for "InternetOpenUrlA;Ansi" )

Но правильнее всего переделать все обьявления на юникод:
InternetOpenUrl (ulong hInternet, ref string lpszUrl, ref string lpszHeaders, ulong dwHeadersLength, ulong dwFlags, ref ulong dwContext) Library "WININET.DLL" Alias for "InternetOpenUrl W "
Действительно, дело в этом!
Огромные благодарности Dmitry.!
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / http
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]