Re: WSH: обсуждаем DynamicWrapperX от YMP
К сожалению, декларация указателей на числа через большие буквы в JScript не работает. Это связано с особенностями устройства переменных. Скажем, в VBScript это ссылки, поэтому есть возможность вычислить адрес, где лежит само число. В JScript такой возможности нет. Поэтому в нём большие буквы работают только для строк. Обходной манёвр с new Number() работал в XP SP1, когда я писал Dynwrapx, но уже с SP2 это не работало, т.к. они слегка изменили структуру объекта Number.
Но передать указатель, конечно, можно — указатель на строку. Функция туда что-то запишет, а Вы потом считаете через метод NumGet.
В Вашем коде я заменил "L" на "p" и буфер создал так: var buf = Space(2, ""); — два юникодных символа, т.е. 4 байта, с обнулением байтов. Ошибок теперь нет, ну а тот ли результат, что должен быть, посмотрите сами.
<html>
<head>
<title> Curl Test</title>
</head>
<body>
<script type="text/javascript">
CURLOPT_URL = 10002
CURLINFO_RESPONSE_CODE = 2097154
CURLOPT_HEADER = 42
var DX=new ActiveXObject("DynamicWrapperX");
var libcurldll="libcurl.dll";
//function curl_easy_init:pCURL; cdecl; external LIB_CURL;
DX.Register(libcurldll, "curl_easy_init", "r=p");
//function curl_easy_setopt(curl:pCURL; option:CURLoption):CURLcode; varargs; cdecl; external LIB_CURL;
DX.Register(libcurldll, "curl_easy_setopt", "i=plp","r=l")
//function curl_easy_perform(curl:pCURL):CURLcode; cdecl; external LIB_CURL;
DX.Register(libcurldll, "curl_easy_perform", "i=p","r=l")
//procedure curl_easy_cleanup(curl:pCURL); cdecl; external LIB_CURL;
DX.Register(libcurldll, "curl_easy_cleanup", "i=p")
//function curl_easy_getinfo(curl:pCURL; info:CURLINFO; out value):CURLcode; cdecl; external LIB_CURL;
DX.Register(libcurldll, "curl_easy_getinfo", "i=plp","r=l")
//function curl_easy_duphandle(curl:pCURL):pCURL; cdecl; external LIB_CURL;
DX.Register(libcurldll, "curl_easy_duphandle", "i=p","r=p")
//procedure curl_easy_reset(curl:pCURL); cdecl; external LIB_CURL;
DX.Register(libcurldll, "curl_easy_reset", "i=p")
with (DX)
{
//выполняем инициализацю
var curl = curl_easy_init();
if(curl)
{
//проверяем
//задаем опцию - получить страницу по адресу http://google.com
curl_easy_setopt(curl, CURLOPT_URL, "http://google.com/");
//указываем прокси сервер
// curl_easy_setopt(curl, CURLOPT_PROXY, "proxy:8080");
//задаем опцию отображение заголовка страницы
curl_easy_setopt(curl, CURLOPT_HEADER, 1);
//вызываем функцию, выполняющюю все операции, заданные в опциях (получение страницы, передача данных и т.д.), результат - объект типа CURLcode
res = curl_easy_perform(curl);
//декларирую буфер с типом лонг :)
var buf = Space(2, "");
// пробуем получить ответ сервера
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, buf)
document.writeln("res="+res+"<br>")
document.writeln("buf="+NumGet(buf)+"<br>")
//выполняем обязательное завершение сессии
curl_easy_cleanup(curl);
}
}
</script>
</body>
</html>