Переключение на Главную Страницу Страницы: 1 2 [3] 4  ОтправитьПечать
Очень популярная тема (более 25 ответов) Передача параметров в VBScript (число прочтений - 30608 )
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #30 - 28. Апреля 2008 :: 12:25
Печать  
artbear писал(а) 28. Апреля 2008 :: 11:04:
Что-то у меня после такого кода при завершении работы 1С начал зависать процесс 1cv7.exe Печаль
Я так понимаю, где-то ссылка повисла Печаль
Чего делать?

А, ну да.. Всё время забываю тестировать без vkloader.  Печаль Надо подумать..
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #31 - 28. Апреля 2008 :: 12:30
Печать  
Ссылка зависает из-за
Код
Выбрать все
		LPOLESTR pszDisplayName = NULL;
		moniker->GetDisplayName(NULL, NULL, &pszDisplayName);
 


Но добавочный код, который уничтожает выделенную строку, также не помогает Печаль
Код
Выбрать все
	LPOLESTR pszDisplayName = NULL;
moniker->GetDisplayName(NULL, NULL, &pszDisplayName);

CString temp(pszDisplayName);

CComPtr<IMalloc> spMalloc;
if(FAILED(CoGetMalloc(MEMCTX_TASK, &spMalloc)))
	return FALSE;

spMalloc->Free(pszDisplayName);
 

  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #32 - 28. Апреля 2008 :: 16:27
Печать  
artbear писал(а) 28. Апреля 2008 :: 12:30:
Ссылка зависает из-за

IMHO, из-за счётчика ссылок на param.pdispVal, а не из-за этого лика. Но как-то странно - при многократном последовательном вызове не после каждого (???) вызова его нужно освобождать. Чего-то у меня с головой, наверное.. Ужас Или что-то где-то не инициализировано.. Нерешительный
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #33 - 29. Апреля 2008 :: 05:49
Печать  
berezdetsky писал(а) 28. Апреля 2008 :: 16:27:
artbear писал(а) 28. Апреля 2008 :: 12:30:
Ссылка зависает из-за

IMHO, из-за счётчика ссылок на param.pdispVal, а не из-за этого лика. Но как-то странно - при многократном последовательном вызове не после каждого (???) вызова его нужно освобождать. Чего-то у меня с головой, наверное.. Ужас Или что-то где-то не инициализировано.. Нерешительный

Да, ты прав, именно из-за param.pdispVal
Но после ручного освобождения
param.pdispVal->Release();
все стало нормально, процесс больше не зависает и все нормально отрабатывает.

В итоге код стал такой:
Код
Выбрать все
BOOL CSystem::funcSerialize(CValue& RetVal, CValue **ppValue)
{
	CComVariant param;
	static_cast<CBLMyEx*>(NULL)->ValueToVariantEx(ppValue[0][0],&param);
	if(param.vt != VT_DISPATCH)
		RetVal = "";
	else
	{
		IDispatchPtr dispatch(param.pdispVal);
		param.pdispVal->Release();

		IMonikerPtr moniker;
		if FAILED(CreateObjrefMoniker(dispatch,&moniker))
			RuntimeError("Система::Сериализовать - неудача");

		LPOLESTR pszDisplayName = NULL;
		if FAILED(moniker->GetDisplayName(NULL, NULL, &pszDisplayName))
			RuntimeError("Система::Сериализовать - неудача");

		RetVal = CString(pszDisplayName);

		CoTaskMemFree(pszDisplayName);
	}

	return TRUE;
}
 


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

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #34 - 29. Апреля 2008 :: 06:56
Печать  
artbear писал(а) 29. Апреля 2008 :: 05:49:
berezdetsky писал(а) 28. Апреля 2008 :: 16:27:
artbear писал(а) 28. Апреля 2008 :: 12:30:
Ссылка зависает из-за

IMHO, из-за счётчика ссылок на param.pdispVal, а не из-за этого лика. Но как-то странно - при многократном последовательном вызове не после каждого (???) вызова его нужно освобождать. Чего-то у меня с головой, наверное.. Ужас Или что-то где-то не инициализировано.. Нерешительный

Да, ты прав, именно из-за param.pdispVal
Но после ручного освобождения
param.pdispVal->Release();
все стало нормально, процесс больше не зависает и все нормально отрабатывает.

Да, все-таки баг есть, тестировал немножко неверный код, так освобождать нельзя, GetObject в скрипте перестает работать.
Нужно еще разбираться Печаль
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #35 - 29. Апреля 2008 :: 08:14
Печать  
В общем, вывод такой - объект, который сериализуем, а точнее, IDispatch для него должен существовать на момент использования его сериализованного представления.
Удалять этот объект нужно уже после использования его сериализованного представления

Поэтому придется пойти другим путем - я добавил в 1С++ спец.класс "Сериализация" с единственным методом "Сериализовать", в деструкторе этого класса и будет удаляться существующий  IDispatch Улыбка
И клиентский код выглядит очень просто, без всяких доп. фишек Улыбка

Например, приведенный выше пример от Степана будет выглядеть так:
Код
Выбрать все
Процедура Тест_ПередачаВСкриптСПомощьюСериализовать() Экспорт

	//Система = СоздатьОбъект("Система");
//Т = СоздатьОбъект("ТаблицаЗначений");
//лТекст = Система.Сериализовать(Т);
//Сообщить("<"+лТекст+">");

Scr=СоздатьОбъект("MSScriptControl.ScriptControl");
scr.Language="vbscript";

Т = СоздатьОбъект("ТаблицаЗначений");
Т.НоваяКолонка("t1");
Т.НоваяСтрока();
лНужноеЗначение = 111;
Т.t1 = лНужноеЗначение;

Сериализация = СоздатьОбъект("Сериализация");

Scr.AddCode("
        |Function TestVT
        |	Set v=GetObject("""+Сериализация.Сериализовать(Т)+""")
        |	v.SelectLines()
        |	v.GetLine()
        |	TestVT=v.t1
        |End Function");

Если Scr.Eval("TestVT()") <> лНужноеЗначение Тогда
	Предупреждение("Неуспех");
Иначе
	Предупреждение("Успех");
КонецЕсли;

КонецПроцедуры
 


Что и требовалось Улыбка

PS повторный вызов Сериализовать() удалит предыщий IDispatch, т.е. лика также не будет.

Нормальное решение, что скажете?
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #36 - 29. Апреля 2008 :: 08:15
Печать  
Блин, только что дошло, что тоже самое можно и для Системы оставить Улыбка
Что скажете?
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #37 - 29. Апреля 2008 :: 11:49
Печать  
artbear писал(а) 29. Апреля 2008 :: 08:14:
В общем, вывод такой - объект, который сериализуем, а точнее, IDispatch для него должен существовать на момент использования его сериализованного представления.
Удалять этот объект нужно уже после использования его сериализованного представления

Не понятно, как тогда это работает у steban? Ну и ладно..

artbear писал(а) 29. Апреля 2008 :: 08:14:
Нормальное решение, что скажете?

Улыбка

Только это маршаллинг, а не сериализация, как я понимаю.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #38 - 30. Апреля 2008 :: 18:57
Печать  
artbear писал(а) 29. Апреля 2008 :: 08:15:
Блин, только что дошло, что тоже самое можно и для Системы оставить Улыбка
Что скажете?

Потестил сегодняшний ночник - нескладное что-то получилось. Печаль
В архиве два тестовых глобальных модуля.
  • Делаем с первым пустую конфигурацию, заходим, выходим - 1С зависает. Если переменную ст очистить явно - зависания нет.
  • Со вторым интереснее. Делаем с ним пустую конфигурацию, заходим - под вистой 1С молча падает, под ХР не падает (с тем кодом метода, с которого всё началось, под вистой не падает).
  • Дальше. Делаем пустую конфигурацию, второй глобальный модуль загружаем директивой ЗагрузитьИзФайла, запускаем под ХР - иногда работает, иногда выскакивает исключение "Ошибка выполнения Microsoft VBScript: Недопустимый вызов или аргумент процедуры: 'GetObject'". Впрочем, возможно, дело не в ЗагрузитьИзФайла, а в том, что иногда оно под ХР всё-таки работает.  Нерешительный
  

GMs.zip ( 1 KB | Загрузки )

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #39 - 04. Мая 2008 :: 06:04
Печать  
berezdetsky писал(а) 30. Апреля 2008 :: 18:57:
artbear писал(а) 29. Апреля 2008 :: 08:15:
Блин, только что дошло, что тоже самое можно и для Системы оставить Улыбка
Что скажете?

Потестил сегодняшний ночник - нескладное что-то получилось. Печаль
В архиве два тестовых глобальных модуля.
  • Делаем с первым пустую конфигурацию, заходим, выходим - 1С зависает. Если переменную ст очистить явно - зависания нет.
  • Со вторым интереснее. Делаем с ним пустую конфигурацию, заходим - под вистой 1С молча падает, под ХР не падает (с тем кодом метода, с которого всё началось, под вистой не падает).
  • Дальше. Делаем пустую конфигурацию, второй глобальный модуль загружаем директивой ЗагрузитьИзФайла, запускаем под ХР - иногда работает, иногда выскакивает исключение "Ошибка выполнения Microsoft VBScript: Недопустимый вызов или аргумент процедуры: 'GetObject'". Впрочем, возможно, дело не в ЗагрузитьИзФайла, а в том, что иногда оно под ХР всё-таки работает.  Нерешительный

Подтверждаю по обоим пунктам.
п.2. - Висты нет, но на Вин2003 Сп1 с простым глобальником (без ЗагрузитьИзФайла) падает на разных конструкциях Печаль
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #40 - 04. Мая 2008 :: 06:13
Печать  
По п.1 - если явно обнулить глобальный объект Система (ст), например, в ПриЗавершенииРаботыСистемы, все будет нормально.
Видимо, дело в том, что у 1С дело просто не доходит до деструктора ст Печаль, т.е. 1С зависает раньше Печаль
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #41 - 04. Мая 2008 :: 06:18
Печать  
По п.2 - в режиме отладки 1С++ в Студии все проходит на ура на Вин2003, без отладочного режима 1С дает ошибку на GetObject Печаль
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #42 - 06. Мая 2008 :: 12:34
Печать  
Похоже, что придется временно убрать данный метод из 1С++ версии 2.5 до выпуска релиза.
В 3.0 можно временно, для тестирования и доработки оставить.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #43 - 07. Мая 2008 :: 07:07
Печать  
artbear писал(а) 06. Мая 2008 :: 12:34:
Похоже, что придется временно убрать данный метод из 1С++ версии 2.5 до выпуска релиза.

Значит, ещё один релиз пройдёт мимо. Печаль А жаль - мне уже начало нравиться писать что-то вроде
Код
Выбрать все
тбл.СоздатьЭУ("OWC11.Spreadsheet");
conn = CreateObject("ADODB.Connection");
conn.Open("Provider=OLEDB1C");
тбл.Объект.DataSource = conn.Execute(ст.Сериализовать(тз));
тбл.Объект.DataMember = ""; 

  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #44 - 07. Мая 2008 :: 10:43
Печать  
Возможно, нужно просто явно указать в доке, что после вызова Сериализовать нужно обязательно уничтожить объект Система.
Или явный метод УничтожитьОбъектСериализации
Довольно коряво, но будет работать Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 [3] 4 
ОтправитьПечать