201

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>

202 (изменено: mikser, 2011-03-22 15:30:26)

Re: WSH: обсуждаем DynamicWrapperX от YMP

YMP
Cпс, вчера входе 4 часов проб и ошибок пришел ровно к тем же выводам, что вы щас рассказали
Правда так и не понял в каком формате JScript хранит тип нумбер если не в виде указателя.
Вот написал функцию для передачи указателя на число в дллевскую функцию.

 function IntPtr(n)//возвращает указатель на число
 {
    var p=DX.Space(2,"")
    DX.NumPut(n, p)
    return p;
 }

А под числа с плавающей запятой скока байт выделяет JScript?

Выходит
Числа в JScript  это числа.
Строки это указатели на строки.
Массивы и объекты это указатели на массивы и объекты?

203

Re: WSH: обсуждаем DynamicWrapperX от YMP

mikser пишет:

Правда так и не понял в каком формате JScript хранит тип нумбер если не в виде указателя.

В виде нумбера и хранит. Дробные числа в JScript — это 8 байт. Строки и объекты — да, указатели. Массив — это тоже объект.

204 (изменено: mikser, 2011-03-22 20:56:51)

Re: WSH: обсуждаем DynamicWrapperX от YMP

Еще вопрос как передаются параметры в дллную процедуру ?
Не допонимаю ваших алгоритмов преобразований типов из JScript'oвых в DLL'евские
Вот допустим параметр описан как "i=p".
Функцию в скрипте вызываю так func(7).
В каком виде передастся семерка в длл функцию?
Как указатель на число 7?
Ок, а если я вызову ее так func("строка") она передастся как указатель на строку? А зачем тогда нужна StrPtr функция?

YMP пишет:

В виде нумбера и хранит.

Прям в виде 4х или 8 байт?
А где записано какой конкретно  этот нумбер целый или дробный?

205

Re: WSH: обсуждаем DynamicWrapperX от YMP

Нет, через "p" передаются сами числа. Ну разве что в VBS, где есть одно- и двухбайтные целые, они будут расширены до 4 байт. Кроме того "p" играет роль напоминания о том, что в целевой функции этот параметр — указатель. На мой взгляд, лучше, если список параметров задан так: i=pluhl, нежели чем i=lllll. Хотя по идее все они 4-байтные и можно было бы обойтись типом "l". А так видно, что первое указатель, второе знаковое целое, третье беззнаковое, четвёртое — хэндл. Легче ориентироваться, по-моему. Ну и ещё некоторый контроль типов производится, т.е. если параметр "p", то отрицательное число подсунуть не получится, то же и относительно "u". Замысливалось как некоторая защита от ошибок.

В случае строк передаётся указатель. То же в случае объектов — в функцию будет передан указатель на объект. StrPtr — на всякий случай. Вроде народ использует.

Строго говоря, как переменные хранятся в JScript, я не знаю (где-то читал, что будто бы все числа хранятся как Double), знаю только, в каком виде передаются методам объекта — в виде структур VARIANT. Это структура размером 16 байт, в первых двух байтах число, обозначающее тип хранимых в ней данных. Сами данные обычно по смещению 8 от начала, т.е. во второй половине структуры.

206 (изменено: mikser, 2011-03-23 01:24:13)

Re: WSH: обсуждаем DynamicWrapperX от YMP

По моему через p передается указатель.
В функции экспортируемой из длл третий параметр описан как не что типа вариант то есть может быть и строкой и числом.
Я описываю  его как p.
В случае если нужно передать строку передаю ее как строку, тока надо ее преобразовать в однобайтовую, вот тут и пригодилась StrPtr.
А в случае с если третий параметр это число, то просто пихаю в него константу, пробовал передавать указатели на числа и ничего не вышло.

YMP пишет:

Это структура размером 16 байт, в первых двух байтах число, обозначающее тип хранимых в ней данных. Сами данные обычно по смещению 8 от начала, т.е. во второй половине структуры.

ОМГ как не экономично. Вот почему винда так много памяти съедает.
Под тип целых 2 байта при количестве типов 4 штуки - число, дробное_число, объект, строка. Что бы их закодировать достаточно двух битов а не байтов. Ну хорошо а как насчет тех 6 байтов что идут после первых двух байтов?

207

Re: WSH: обсуждаем DynamicWrapperX от YMP

OFF: mikser, работа с двумя битами вместо работы с целым словом потребует большего времени работы.

208

Re: WSH: обсуждаем DynamicWrapperX от YMP

mikser пишет:

По моему через p передается указатель.

Ну, мне-то лучше знать. Строка и объект передаются через "p" как указатель, а числа передаются как сами значения этих чисел.

mikser пишет:

Под тип целых 2 байта при количестве типов 4 штуки - число, дробное_число, объект, строка. Что бы их закодировать достаточно двух битов а не байтов. Ну хорошо а как насчет тех 6 байтов что идут после первых двух байтов?

Вообще-то типов много, просто в JScript используются лишь некоторые. Есть типы, у которых значение занимает больше 8 байт, тут и пригождаются лишние 6.

209 (изменено: mikser, 2011-03-24 00:50:38)

Re: WSH: обсуждаем DynamicWrapperX от YMP

YMP, ок.
А как дела с многопоточностью, с 2008 года дело так и не продвинулось?
Поточные функции не вызываются .

Мне она нужна для реализации асинхроных http запросов
так как в курле можно сделать тока синхроный.

210

Re: WSH: обсуждаем DynamicWrapperX от YMP

Нет, не продвинулось. Функции, думаю, вызываются, только толку нет. Я сейчас взялся изучать C++, так что, наверно, напишу Dynwrapx-2 на нём в качестве тренировки. Там и с многопоточностью поковыряюсь, посмотрю, что можно сделать.

211 (изменено: mikser, 2011-03-26 03:08:28)

Re: WSH: обсуждаем DynamicWrapperX от YMP

YMP
Написал свою JS обертку к libCurl   обычно все работает, но иногда (на работающем  коде) Crash ит.
Windows пишет, что ошибка в модуле dynwrapx.dll. Как такое лечить?

212

Re: WSH: обсуждаем DynamicWrapperX от YMP

Ну, она ещё обычно пишет смещение, по которому произошла ошибка. По нему в отладчике можно код посмотреть, который ошибку вызвал.

213 (изменено: mikser, 2011-03-28 00:57:20)

Re: WSH: обсуждаем DynamicWrapperX от YMP

Cейчас впервые столкнулся с тем, что уборщик мусора иногда удаляет строки указатель на которые хранятся в виде числа.
Вот, что оказывается первопричина большинства глюков!

В моем случае это проявлялось в том, что HTTP заголовки:
* иногда не отсылались вообще
* иногда высылались частично
* иногда отсылалось лишь несколько букв из заголовка

Очень долго не мог понять, что это за мистика такая .

Серьёзная проблема:
А ведь иногда curl Dll ка должна своими внутреними функциями создавать  структуры данных (структуры эти порой не простые а в виде списков; тоесть структура содержит указатель на другую структуру  подобную себе), связь с этими структурами даных из JS скрипта  - указатель - 4 байтовое число.
А теперь внимание вопрос - что помешает JS - ному сборщику мусора  прибить эти структуры сразу после того, как дллная функция их создаст.
Мне кажется, что именно так и происходит в моем случае.
Могу выложить примеры.

YMP, это никак не вылечить?

Я пока выкрутился тем, что написал свою JS функциию которая дублируют функцию (которая создает связный список строк) в dll'ке,  но не только дублирует,  но и сохраняет все структуры в глобальном масиве, что бы до них не добрался сборщик мусора. Но это извращение конечно.

214

Re: WSH: обсуждаем DynamicWrapperX от YMP

Если строка является локальной переменной, то не вижу, как можно помешать её удалению. Но память под структуры можно запрашивать через GlobalAlloc, например. Никуда она потом не должна деваться, пока сами не освободите.

215 (изменено: mikser, 2011-03-28 15:47:59)

Re: WSH: обсуждаем DynamicWrapperX от YMP

Ну это то конечно, я про тот случай когда в скрипте нет прямых ссылок на структуры.
Вот код на Сях

 CURL handle;
  struct curl_slist *slist=NULL;
 

 slist = curl_slist_append(slist, "pragma:");
  curl_easy_setopt(handle, CURLOPT_HTTPHEADER, slist);
 

 curl_easy_perform(handle);


 curl_slist_free_all(slist); /* free the list again */

struct curl_slist  это структура из 8 байт первые 4 указатель на строку а вторые 4 байта это указатель на следующую struct curl_slist
и так пока строки не кончатся.
В сях такое может и прокатит но никак не в JS.
Пробовал вместо норм работы получил краш.

curl_slist_append создает свои связаные структуры сам. Сборщик мусора JS смотрит на эти структуры  и видит, что в скрипте на них ссылок нету ну разве, что только ссылка на первую структуру. И естественно удаляет.

216

Re: WSH: обсуждаем DynamicWrapperX от YMP

mikser пишет:

curl_slist_append создает свои связаные структуры сам. Сборщик мусора JS смотрит на эти структуры  и видит, что в скрипте на них ссылок нету ну разве, что только ссылка на первую структуру. И естественно удаляет.

Что-то Вы не то говорите. Если так, то почему он не удаляет структуры, создаваемые объектом DynamicWrapperX? В скрипте же нет на них ссылок. Взял бы да удалил нафиг.

217 (изменено: mikser, 2011-03-28 16:31:34)

Re: WSH: обсуждаем DynamicWrapperX от YMP

Ссылки на структуры актив икс есть внутри актив икса.
Хотя конечно это лишь догадка.

YMP Как бы то ни было, посмотрите пожалуйста этот пример:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <title> Curl Append Slise</title>
 </head>

 <body>
  <script type="text/javascript">

 var DX=new ActiveXObject("DynamicWrapperX");
 var LibCURL="libcurl.dll";
 //function  curl_easy_init:pCURL; cdecl; external LIB_CURL;
  DX.Register(LibCURL, "curl_easy_init",      "r=h");
  //function  curl_easy_setopt(curl:pCURL; option:CURLoption):CURLcode; varargs; cdecl; external LIB_CURL;
  DX.Register(LibCURL, "curl_easy_setopt",    "i=hup","r=l")
  //function  curl_easy_perform(curl:pCURL):CURLcode; cdecl; external LIB_CURL;  
  DX.Register(LibCURL, "curl_easy_perform",   "i=h","r=l")

  //procedure curl_easy_cleanup(curl:pCURL); cdecl; external LIB_CURL;
  DX.Register(LibCURL, "curl_easy_cleanup",   "i=h")

  //function  curl_slist_append(list:pcurl_slist; s:pchar):pcurl_slist; cdecl; external LIB_CURL;
  DX.Register(LibCURL, "curl_slist_append" ,"i=pp", "r=p")
 //procedure curl_slist_free_all(list:pcurl_slist); cdecl; external LIB_CURL;
  DX.Register(LibCURL, "curl_slist_free_all", "i=p", "r=p")

  CURLE_OK=0;
  CURLOPT_URL                     = 10002
  CURLINFO_RESPONSE_CODE           = 2097154
  CURLOPT_HEADER                  = 42
  CURL_ERROR_SIZE = 256;
  CURLOPT_FOLLOWLOCATION          = 52;
    CURLOPT_SSL_VERIFYPEER          = 64;
    CURLOPT_MAXREDIRS               = 68;
    CURLOPT_FILE                    = 10001;
    CURLOPT_WRITEFUNCTION           = 20011;
    CURLOPT_HEADERFUNCTION          = 20079;
   CURLOPT_HTTPHEADER              = 10023;
 CURLOPT_WRITEDATA = CURLOPT_FILE;

var Headers = [
        "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15",
        "Accept: */*",
        "Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3",
        "Accept-Encoding: deflate",
        "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7",
        "Keep-Alive: 115",
        "Connection: keep-alive",
        "Referer: http://google.com",
        "Cache-Control: max-age=0"
        ];

var url="http://www.google.ru/"

var mybuf="";
pWriter=DX.RegisterCallback(Writer,"i=puup","r=u")
function Writer(data, size, nmemb, pbuffer)
{
	mybuf+=DX.StrGet(data,"s")
	return size*nmemb;
}

//поехали
 with (DX)//чтобы лишний раз не писать
 {
	var curl=curl_easy_init() //инициализируем курл
    var crash;//запоминаем выбор пользователя
	if (crash=confirm("Вам с крашем или без?")) //если с крашем то 
	{//формируем HTTP заголовки в случае отказа будет запрос без http заголовков
		var slist=Space(2);//под указатель
		for (var i=0;i<Headers.length;i++ )
			//переводим нашь масив заголовков в понятный курлу формат
			slist = curl_slist_append(slist, StrPtr(Headers[i], "s"));
		//передаем курлу наши заголовки
		curl_esasy_setopt(curl,CURLOPT_HTTPHEADER,slist);
	}
	//указываем урл
	curl_easy_setopt(curl,CURLOPT_URL,StrPtr(url,"s"))
	//ставим наш обработчик что бы получить ответ сервера иначе в курле никак :(
	curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,pWriter)

	//собственно делаем запрос
	curl_easy_perform(curl)

	//выводим ответ на экран :)
	document.body.innerText=mybuf;

	//чистим курл хендл
	curl_easy_cleanup(curl)

    if (crash)//если была создана структура под заголовки то чистим ее
	   curl_slist_free_all(slist);
	
 }


  </script>
 </body>
</html>

218

Re: WSH: обсуждаем DynamicWrapperX от YMP

mikser пишет:

Ссылки на структуры актив икс есть внутри актив икса.

Конечно, есть (указатели), только JScript про них ничего не знает. Так что их всё равно что нет. Но никогда он не полезет освобождать память, запрошенную объектом, это был бы полный беспредел.

Заметил опечатку в имени функции:

curl_esasy_setopt(curl,CURLOPT_HTTPHEADER,slist);

Что касается slist, то дело ясное. Сначала это у Вас строка, потом Вы пишете туда значения, возвращаемые функцией. Естественно, указатель на строку, раз он ушёл из этой переменной и "повис в воздухе", может быть освобождён скриптом.

Поэтому советую зарегистрировать GlobalAlloc и запрашивать первоначальный буфер через неё. Эта память никуда не денется.

219 (изменено: mikser, 2011-03-28 17:59:31)

Re: WSH: обсуждаем DynamicWrapperX от YMP

YMP пишет:

Что касается slist, то дело ясное. Сначала это у Вас строка, потом Вы пишете туда значения, возвращаемые функцией. Естественно, указатель на строку, раз он ушёл из этой переменной и "повис в воздухе", может быть освобождён скриптом.

Ну и фиг с ним с этим указателем на строку. Да на самом деле не важно изначальное значение slist
при первом вызове  curl_slist_append его инициализирует своим значением
при последующих вызовах curl_slist_append просто добавляет новые значения.

Внес исправления:


var slist=Space(2,"");//struct curl_slist *slist=NULL;
  for (var i=0;i<Headers.length;i++ )
  //переводим нашь масив заголовков в понятный курлу формат
  slist = curl_slist_append(slist, StrPtr(Headers[i], "s"));
//передаем курлу наши заголовки
curl_easy_setopt(curl,CURLOPT_HTTPHEADER,slist);

Все равно крашит

YMP пишет:

Поэтому советую зарегистрировать GlobalAlloc и запрашивать первоначальный буфер через неё. Эта память никуда не денется.

Пример применительно к данной ситуации можно?  Я если честно не представляю как его тут можно заюзать.
Так как вся работа с выделением памяти происходит внутри curl_slist_append.

220

Re: WSH: обсуждаем DynamicWrapperX от YMP

Все же последовал вашему совету


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <title> Curl Append Slise</title>
 </head>

 <body>
  <script type="text/javascript">

 var DX=new ActiveXObject("DynamicWrapperX");
 var LibCURL="libcurl.dll";
 //function  curl_easy_init:pCURL; cdecl; external LIB_CURL;
  DX.Register(LibCURL, "curl_easy_init",      "r=h");
  //function  curl_easy_setopt(curl:pCURL; option:CURLoption):CURLcode; varargs; cdecl; external LIB_CURL;
  DX.Register(LibCURL, "curl_easy_setopt",    "i=hup","r=l")
  //function  curl_easy_perform(curl:pCURL):CURLcode; cdecl; external LIB_CURL;  
  DX.Register(LibCURL, "curl_easy_perform",   "i=h","r=l")

  //procedure curl_easy_cleanup(curl:pCURL); cdecl; external LIB_CURL;
  DX.Register(LibCURL, "curl_easy_cleanup",   "i=h")

  //function  curl_slist_append(list:pcurl_slist; s:pchar):pcurl_slist; cdecl; external LIB_CURL;
  DX.Register(LibCURL, "curl_slist_append" ,"i=pp", "r=p")
 //procedure curl_slist_free_all(list:pcurl_slist); cdecl; external LIB_CURL;
  DX.Register(LibCURL, "curl_slist_free_all", "i=p", "r=p")

DX.Register("Kernel32.dll","GlobalAlloc","i=uu","r=h")
DX.Register("Kernel32.dll","GlobalFree","i=h","r=h")

  CURLE_OK=0;
  CURLOPT_URL                     = 10002
  CURLINFO_RESPONSE_CODE           = 2097154
  CURLOPT_HEADER                  = 42
  CURL_ERROR_SIZE = 256;
  CURLOPT_FOLLOWLOCATION          = 52;
    CURLOPT_SSL_VERIFYPEER          = 64;
    CURLOPT_MAXREDIRS               = 68;
    CURLOPT_FILE                    = 10001;
    CURLOPT_WRITEFUNCTION           = 20011;
    CURLOPT_HEADERFUNCTION          = 20079;
   CURLOPT_HTTPHEADER              = 10023;
 CURLOPT_WRITEDATA = CURLOPT_FILE;

GHND=0x0042	//Combines GMEM_MOVEABLE and GMEM_ZEROINIT.
GMEM_FIXED=0x0000	//Allocates fixed memory. The return value is a pointer.
GMEM_MOVEABLE=0x0002	/*Allocates movable memory. Memory blocks are never moved in physical memory, but they can be moved within the default heap. 
The return value is a handle to the memory object. To translate the handle into a pointer, use the GlobalLock function.
This value cannot be combined with GMEM_FIXED.*/
GMEM_ZEROINIT=0x0040	//Initializes memory contents to zero.
GPTR=0x0040	//Combines GMEM_FIXED and GMEM_ZEROINIT.


var Headers = [
        "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15",
        "Accept: */*",
        "Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3",
        "Accept-Encoding: deflate",
        "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7",
        "Keep-Alive: 115",
        "Connection: keep-alive",
        "Referer: http://google.com",
        "Cache-Control: max-age=0"
        ];

var url="http://www.google.ru/"

var mybuf="";
pWriter=DX.RegisterCallback(Writer,"i=puup","r=u")
function Writer(data, size, nmemb, pbuffer)
{
	mybuf+=DX.StrGet(data,"s")
	return size*nmemb;
}

//поехали
 with (DX)//чтобы лишний раз не писать
 {
	var curl=curl_easy_init() //инициализируем курл
    var crash;//запоминаем выбор пользователя
	if (crash=confirm("Вам с крашем или без?")) //если с крашем то 
	{//формируем HTTP заголовки в случае отказа будет запрос без http заголовков
		var slist=GlobalAlloc(GHND,1024*10)
		//10 килобайт обнуленной перемещаемой памяти  //для верности больше чем нужно
		for (var i=0;i<Headers.length;i++ )
			//переводим нашь масив заголовков в понятный курлу формат
			slist = curl_slist_append(slist, StrPtr(Headers[i], "s"));
		//передаем курлу наши заголовки
		curl_easy_setopt(curl,CURLOPT_HTTPHEADER,slist);
	}
	//указываем урл
	curl_easy_setopt(curl,CURLOPT_URL,StrPtr(url,"s"))
	//ставим наш обработчик что бы получить ответ сервера иначе в курле никак :(
	curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,pWriter)

	//собственно делаем запрос
	curl_easy_perform(curl)

	//выводим ответ на экран :)
	document.body.innerText=mybuf;

	//чистим курл хендл
	curl_easy_cleanup(curl)

    if (crash)//если была создана структура под заголовки то чистим ее
	{
	 //  curl_slist_free_all(slist);
	   GlobalFree(slist)
	   
	}
	
 }


  </script>
 </body>
</html>

Краши вроде прекратились.
Но я не понимаю как это работает

В частности не понятно как убирать за собой

так


  curl_slist_free_all(slist);
  GlobalFree(slist)

или так


  GlobalFree(slist)
  curl_slist_free_all(slist);

или так

  curl_slist_free_all(slist);

или так

 GlobalFree(slist)

221

Re: WSH: обсуждаем DynamicWrapperX от YMP

Что-то не пойму Вашей логики. Что за буфер в 10 Кб? В сишном коде в slist изначально пишется NULL. NULL — это не указатель на ноль, это просто ноль. Поэтому нужно так:

var slist = 0;

222 (изменено: mikser, 2011-03-28 19:07:59)

Re: WSH: обсуждаем DynamicWrapperX от YMP

YMP пишет:

Что-то не пойму Вашей логики. Что за буфер в 10 Кб? В сишном коде в slist изначально пишется NULL. NULL — это не указатель на ноль, это просто ноль. Поэтому нужно так:

var slist = 0;

Да, но тогда я не пойму куда совать GlobalAlloc() то есть, что делать с хенделом который он возвращает.

Благодарю, YMP, все заработало.
PS Честно говоря не помню уже почему сразу так и не сделал, кажется я делал так var slist = null; и врапер ругался на несовместимость типов, после чего начал мудрить.

223

Re: WSH: обсуждаем DynamicWrapperX от YMP

GlobalAlloc, похоже, тут не нужен. Но на будущее, используйте с ним флаги GMEM_FIXED или GPTR (если нужно обнуление). GMEM_MOVEABLE нужен для специфических случаев. Фактически он устаревший. Да, с null Dynwrapx не знаком, нигде его не примет.

224 (изменено: mikser, 2011-03-28 19:43:16)

Re: WSH: обсуждаем DynamicWrapperX от YMP

C фикседом крАшило почему то.

225

Re: WSH: обсуждаем DynamicWrapperX от YMP

Ну, это тайна, покрытая мраком. Передавать вместо структуры curl_slist буфер со случайным содержимым в принципе неправильно.

226 (изменено: mikser, 2011-03-29 07:12:47)

Re: WSH: обсуждаем DynamicWrapperX от YMP

Вы сами предложили

Поэтому советую зарегистрировать GlobalAlloc и запрашивать первоначальный буфер через неё.

YMP дурного не посоветует подумалось мне и (проблема была тока в том что там нигде не было буфера)
Я сразу  начал прикидовать куда здесь можно приспособить глобал аллок.
Ага хендл тут всего в одном месте значит туда его и воткнем.
А раз память перемещаемая значит curl_slist_append будет создавать новые указатели строки и структуры только внутри этой перемещаемой памяти - наивно подумал я, не имея понятия как работает перемещаемая память и зачем она вообще нужна. А раз все новые строки и структуры и указатели будут в этой памяти значит она будет защищена от сборщика мусора. Ну по крайней мере логика в этих рассуждениях есть.
Видимо виндовс  рассуждала так же как и я.

227 (изменено: YMP, 2011-03-29 07:55:54)

Re: WSH: обсуждаем DynamicWrapperX от YMP

mikser пишет:

YMP дурного не посоветует подумалось мне

Да всяко бывает. Доверяй, но проверяй. Я сразу не вкурил, что slist инициализируется NULL'ом. Вообще, код, где полно названий типа curl_easy_cleanup, curl_slist_free_all, вводит меня в ступор. Не привык к такому стилю и путаюсь в таких именах. Мне больше нравится по-виндовски — GetModuleBaseName, WideCharToMultiByte и т.п. Более рельефно и поэтому более читабельно, на мой взгляд.

228 (изменено: chessman, 2011-03-29 09:33:52)

Re: WSH: обсуждаем DynamicWrapperX от YMP

Сорри, что вмешиваюсь...на форуме wasm.ru  обсуждалось использование GlobalAlloc и как я понял, лучше использовать HeapAlloc.

P.S. я тут провожу разные эксперименты с DynamicWrapperX и он оказался настолько универсальным, что удалось даже реализовать ActiveX на связке VBS+DWX 

229 (изменено: mikser, 2011-03-29 09:55:37)

Re: WSH: обсуждаем DynamicWrapperX от YMP

chessman о вы то мне и нужны.
Есть ли реализации DWX2 на асме? или тока в скриптовом виде?
Если тока в скриптовом виде то как получить новую копию объекта DWX2?

Первый экземпляр беру так:

DWX2= ScrptCtrl.Modules("Global").CodeObject.Wrap;

А второй как? )


chessman пишет:

что удалось даже реализовать ActiveX на связке VBS+DWX 

Круто конечно тока смысла не вижу, разве что подспорье для вирусописателей.

230

Re: WSH: обсуждаем DynamicWrapperX от YMP

mikser пишет:

Есть ли реализации DWX2 на асме?

Имеется в виду готовый dll или именно сорцы?
У меня нет, но я так думаю, что с помощью ИДы (IDA) их можно получить.
Наверное можно и сам dll поправить, перенести туда то, что написано на скипте.

mikser пишет:

...получить новую копию объекта DWX2?
Первый экземпляр беру так:

DWX2= ScrptCtrl.Modules("Global").CodeObject.Wrap;

А второй как? )

А для чего это?

231 (изменено: mikser, 2011-03-29 10:37:13)

Re: WSH: обсуждаем DynamicWrapperX от YMP

Готовый dll хочу .

Ну мало ли, например 2 разные дллки а в них имена функций совпадают.

Или есть еще мысль создавать внутри функции как локальную переменную.
Что бы после работы функции сборщик мусора имел право освободить память затраченную на врапер.
Ибо после того как функция свое отработает он больше не нужен.

232

Re: WSH: обсуждаем DynamicWrapperX от YMP

А кто мешает создать вторую переменную?

233 (изменено: mikser, 2011-03-29 11:02:19)

Re: WSH: обсуждаем DynamicWrapperX от YMP

Эм а как? Так чтоли?

DWX2_1= ScrptCtrl.Modules("Global").CodeObject.Wrap;
DWX2_2= ScrptCtrl.Modules("Global").CodeObject.Wrap;

По идее  DWX2_1 == DWX2_2 так как оба будут ссылаться на один и тот же экземпляр.

234

Re: WSH: обсуждаем DynamicWrapperX от YMP

DWX2_1= ScrptCtrl.Modules("Global").CodeObject.Wrap1;
DWX2_2= ScrptCtrl.Modules("Global").CodeObject.Wrap2;

235

Re: WSH: обсуждаем DynamicWrapperX от YMP

chessman пишет:

Сорри, что вмешиваюсь...на форуме wasm.ru  обсуждалось использование GlobalAlloc и как я понял, лучше использовать HeapAlloc.

В цикле, наверно. Для разовых операций лучше то, что проще. Проще всего malloc использовать, всего один параметр.

236 (изменено: mikser, 2011-03-29 11:44:46)

Re: WSH: обсуждаем DynamicWrapperX от YMP

chessman пишет:

DWX2_1= ScrptCtrl.Modules("Global").CodeObject.Wrap1;
DWX2_2= ScrptCtrl.Modules("Global").CodeObject.Wrap2;

Так тогда придется переписывать  половину сорцов на Vbs'e. 
Внедрять в него эти идентификаторы. А я с VBS в read-only отоношениях и далеко не всегда успешно разбираю, что же там такое заскриптовано.

YMP Соберите пожалуйста бинарник из сорцов chessman'а

237

Re: WSH: обсуждаем DynamicWrapperX от YMP

mikser пишет:

YMP Соберите пожалуйста бинарник из сорцов chessman'а

Impossible. Были бы они у него, он бы сам собрал. Исходники Dynwrapx утрачены. Теоретически возможно их восстановить по дизасму, но практически это очень нудная работа.

238

Re: WSH: обсуждаем DynamicWrapperX от YMP

mikser пишет:

Так тогда придется переписывать  половину сорцов на Vbs'e. 

Т.е. добавить в VBS строку

Set Wrap2 = CreateObject....

это так сложно?

239 (изменено: mikser, 2011-03-29 12:08:36)

Re: WSH: обсуждаем DynamicWrapperX от YMP

Надо было опубликовать сразу.
Эх....

chessman пишет:
mikser пишет:

Так тогда придется переписывать  половину сорцов на Vbs'e. 

Т.е. добавить в VBS строку

Set Wrap2 = CreateObject....

это так сложно?

Так а дальше же еще  как надо указать ему, что надо пропатчить и этот экземпляр  тоже.
Или он сразу после запуска патчит все экземпляры Wrapperx что найдет в памяти windows?

240

Re: WSH: обсуждаем DynamicWrapperX от YMP

Патчится "движок" com-сервера, после этого все объекты, созданные этим сервером уже измененные. Сам сервер не выгружается из адресного пространства процесса, так что достаточно одного раза.
В данном случае, достаточно просто это проверить методом тыка.

241 (изменено: mikser, 2011-03-29 12:52:04)

Re: WSH: обсуждаем DynamicWrapperX от YMP

А если создать не в тексте VBS а из основного скрипта
Wrap2=new ActiveXObject("DynamicWrapperX") он тоже будет пропатчен?

242

Re: WSH: обсуждаем DynamicWrapperX от YMP

Проще просто попробовать, я-то использую DWX исключительно с 1С

243 (изменено: mikser, 2011-04-27 18:27:32)

Re: WSH: обсуждаем DynamicWrapperX от YMP

В семерке SP 1  - dwx2 больше не пашет.

244 (изменено: chessman, 2011-05-04 16:59:15)

Re: WSH: обсуждаем DynamicWrapperX от YMP

Какая ошибка и что за dwx2?

Сегодня попробовал на боевой базе, на Win 7, все взлетело.

245

Re: WSH: обсуждаем DynamicWrapperX от YMP

Собрал DLL.

http://forum.script-coding.com/viewtopi … 547#p48547

246

Re: WSH: обсуждаем DynamicWrapperX от YMP

chessman
Зря не пометили в ресурсах DLL, что версия другая.

247

Re: WSH: обсуждаем DynamicWrapperX от YMP

YMP пишет:

chessman
Зря не пометили в ресурсах DLL, что версия другая.

Как не пометил? В "Варианте" написал.

248

Re: WSH: обсуждаем DynamicWrapperX от YMP

Да, действительно, в ResHacker'е видно. А Win7 в свойствах файла это поле не показывает, зараза. В FileDescription тогда, что ли, добавить? По смыслу вроде годится. Ну и номер версии лучше бы изменить. На 1.1.0.0, к примеру?

249

Re: WSH: обсуждаем DynamicWrapperX от YMP

Или такая идея: измените номер версии и добавьте себя в копирайт. Чтобы не вставлять куда-то длинных описаний.

Ещё такой вопрос приходил мне в голову: если объекту добавляются новые методы, не положено ли вообще менять CLSID? Ведь по сути это уже не тот объект, что был, а CLSID должен идентифицировать объект однозначно. Вроде бы. Не дошли руки выяснить этот вопрос, да и не очень пока представляю, где искать ответ.

250

Re: WSH: обсуждаем DynamicWrapperX от YMP

YMP пишет:

Или такая идея: измените номер версии и добавьте себя в копирайт. Чтобы не вставлять куда-то длинных описаний.

Я думаю, пусть пока пройдет тестирование, потом изменим. 

YMP пишет:

Ещё такой вопрос приходил мне в голову: если объекту добавляются новые методы, не положено ли вообще менять CLSID? Ведь по сути это уже не тот объект, что был, а CLSID должен идентифицировать объект однозначно. Вроде бы. Не дошли руки выяснить этот вопрос, да и не очень пока представляю, где искать ответ.

Честно, я не вижу в этом никакого практического смысла.

251

Re: WSH: обсуждаем DynamicWrapperX от YMP

chessman пишет:

Я думаю, пусть пока пройдет тестирование, потом изменим.

Неправильные файлы разойдутся. Скрипт, работающий с одним, не будет работать с другим, и будет непонятно, в чём дело. Как я уже говорил, Семёрка некоторые поля в свойствах не показывает, а глянуть в ResHacker'е надо ещё как-то додуматься. А так всё сразу станет ясно — другой номер версии + ещё один разработчик приложил руку.

252

Re: WSH: обсуждаем DynamicWrapperX от YMP

YMP пишет:

А так всё сразу станет ясно — другой номер версии + ещё один разработчик приложил руку.

Согласен. Исправил.

253

Re: WSH: обсуждаем DynamicWrapperX от YMP

artbear, в Коллекции не дискутируем. Перенёс в правильную тему.

artbear пишет:

ИМХО Про this_call неточно написано, непонятно, как применять
Пропущен его вызов
ЗЫ лично я нашел вариант только на форуме 1спп.ру
http://www.1cpp.ru/forum/YaBB.pl?num=1289558528/10#10
ЗЗЫ как исправишь, этот пост удалю

254

Re: WSH: обсуждаем DynamicWrapperX от YMP

Помогите передать параметр node_To

T16bit WINAPI EnCryptFile (char *file_in,
char *file_out,
T16bit node_From,
P16bit node_To,
char *ser);
Функция имеет параметры:
(i) file_in — указатель на строку полного пути к незашифрованному файлу;
(i) file_out — указатель на строку полного пути к зашифрованному файлу;
(i) node_From — номер ключа шифрования отправителя (XXXX), представленный в виде числа типа unsigned short;
(i) node_To — список номеров ключей получателей, который представляется строкой элементов, имеющих тип unsigned short, и оканчивается нулем (0);
(i) ser — указатель на строку длиной 6 символов с номером серии (SSSSSS) открытых ключей шифрования получателей. Если в качестве значения этого параметра указать последовательность из шести нулевых символов (\0\0\0\0\0\0), т. е. зашифрованный файл предназначен для пользователей с тем же номером серии, что и у отправителя, то номер серии берется из драйвера хранения ключевой информации.
Пример вызова функции зашифрования:
char ser_To[7] = “000005”;
node_To[0] = 2;
node_To[1] = 3;
node_To[2] = 0;
node_From = 1;
error_code = EnCryptFile("C:\\AUTOEXEC.BAT", "C:\\TEST.TST",
node_From, node_To , ser_To);

пытаюсь
Set UserWrap = CreateObject("DynamicWrapperX")
UserWrap.Register "wbotho.dll", "EnCryptFile", "i=sstss", "r=t"
res = UserWrap.EnCryptFile("C:\\AUTOEXEC.BAT", "C:\\TEST.TST",1,array(2,3,0),"000005")

Получаю
Ошибка выполнения Microsoft VBScript: Несоответствие типа: 'UserWrap.EnCryptFile'

Как передать в виде аргумента строку элементов, имеющих тип unsigned short, и оканчивающийся нулем ?

255

Re: WSH: обсуждаем DynamicWrapperX от YMP

Выделить память, например HeapAlloc, записать туда последовательность элементов.

256 (изменено: YMP, 2012-07-07 05:29:51)

Re: WSH: обсуждаем DynamicWrapperX от YMP

Для разового выделения проще GlobalAlloc. Она вернёт указатель, вот его и передавать потом — как тип "p", например. Так же обозначьте и тип, возвращаемый GlobalAlloc. Писать туда числа можно через NumPut, читать через NumGet.

257

Re: WSH: обсуждаем DynamicWrapperX от YMP

Поскольку тема после чистки форума работает не совсем корректно, продолжаем здесь: WSH: обсуждаем DynamicWrapperX от YMP - 2.

Мне казалось, я сие уже делал. Или только собирался, но не сделал?!