Имя: Пароль:
1C
1С v8
MSScriptControl не очищаются внутренние переменные
0 TTM
 
19.09.11
15:15
Есть функция. В ней идет подрят 2 обращения к объекту ("MSScriptControl.ScriptControl". После первого обращения во втором объекте всегда висят переменные WshShell, OsVer, а нужные переменнные (ProductName, EditionID, CSDVersion, BuildLab) не видны.
С чем может быть связана такая ситуация?
Собственно функция(как пример):

Функция ПолучитьОписаниеОС()
   
   СтруктураОписаниеОС = Новый Структура;
   
   // получим версию ядра ОС
   Попытка
       ЯдроScrptCtrl = Новый COMОбъект("MSScriptControl.ScriptControl");
       ЯдроScrptCtrl.Language = "vbscript";
       ЯдроScrptCtrl.AddCode("
       |Dim WshShell, OsVer
       |Set WshShell = CreateObject(""WScript.Shell"")
       |OsVer = WshShell.RegRead(""HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion"")
       |Set WshShell = Nothing
       |");
       ВерсияЯдраОС = СокрЛП(ЯдроScrptCtrl.CodeObject.OsVer);
       ЯдроScrptCtrl = Неопределено;
   Исключение
       Сообщить(ОписаниеОшибки());
       Возврат СтруктураОписаниеОС;
   КонецПопытки;
   
   Попытка
       
       ПодстрокаВерсияЯдраОС = Лев(ВерсияЯдраОС,1);
       
       ОСScrptCtrl = Новый COMОбъект("MSScriptControl.ScriptControl");
       ОСScrptCtrl.Language = "vbscript";
       
       Код = "Dim WshShell, ProductName, EditionID, CSDVersion, BuildLab
       |Set WshShell = CreateObject(""WScript.Shell"")
       |ProductName = WshShell.RegRead(""HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName"")
       |CSDVersion  = WshShell.RegRead(""HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CSDVersion"")";
       
       Если ПодстрокаВерсияЯдраОС = "6" Тогда
           Код = Код + "
           |EditionID    = WshShell.RegRead(""HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\EditionID"")";
       КонецЕсли;
       
       Код = Код + "
       |BuildLab    = WshShell.RegRead(""HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\BuildLab"")
       |Set WshShell = Nothing";
       
       ОСScrptCtrl.AddCode(Код);
       
       ProductName = СокрЛП(ОСScrptCtrl.CodeObject.ProductName);
       CSDVersion  = СокрЛП(ОСScrptCtrl.CodeObject.CSDVersion);
       BuildLab    = СокрЛП(ОСScrptCtrl.CodeObject.BuildLab);
       
       Попытка
           EditionID   = СокрЛП(ОСScrptCtrl.CodeObject.EditionID);
       Исключение
           EditionID   = "";
       КонецПопытки;
       
       СтруктураОписаниеОС.Вставить("ProductName", ProductName);
       СтруктураОписаниеОС.Вставить("CSDVersion",  CSDVersion);
       СтруктураОписаниеОС.Вставить("BuildLab",    BuildLab);
       СтруктураОписаниеОС.Вставить("EditionID",   EditionID);
       
       Возврат СтруктураОписаниеОС;
       
   Исключение
       
       Сообщить(ОписаниеОшибки());
       Возврат СтруктураОписаниеОС;
       
   КонецПопытки;
   
КонецФункции
1 aleks-id
 
19.09.11
15:21
а сразу сделать
ОСScrptCtrl = Новый COMОбъект("WScript.Shell");
и с ним уже мутить религия не позволяет?
2 andrewks
 
19.09.11
15:22
а раны тут точно не нужны?
3 TTM
 
19.09.11
15:25
(1) можно, но почему так не работает?
4 TTM
 
19.09.11
15:26
(2) Да, можно попробывать
5 aleks-id
 
19.09.11
15:27
(3) видимо потому что у тебя из одного кома создается второй ком и при убиении первого второй сам не убивается.
6 aleks-id
 
19.09.11
15:27
>>попробывать
закрыл ветку. больше читать не буду.