Bug 3707

Summary: Не реализована часть WBEM, нужная для запуска 1С:Континент-страхование
Product: WINE@Etersoft Reporter: Vitaly Lipatov <lav>
Component: OLE / DDE / RPCAssignee: BUGS@Etersoft <bugs>
Status: CLOSED INVALID QA Contact:
Severity: major    
Priority: P4 CC: kondratyuk, olezha
Version: 1.0.10   
Target Milestone: ---   
Hardware: PC   
OS: All   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on: 3761    
Bug Blocks: 468, 100, 2933, 3810    

Description Vitaly Lipatov 2009-03-20 15:28:34 MSK
trace:reg:NtOpenKey (0x20c,L"WbemScripting.SWbemLocator\\CLSID",f003f,0x32e6c0)
trace:reg:NtOpenKey <- (nil)
...

trace:reg:NtOpenKey (0x20c,L"winmgmts\\CLSID",f003f,0x32d9f4)
trace:reg:NtOpenKey <- (nil)


Поведение поменялось, когда, пробуя
подставить виндовые библиотеки,
зарегистрировал wbemdisp.dll - необходимый ключ
хранится в ней.

Теперь - ошибка:
err:ole:apartment_getclassobject DllGetClassObject returned error 0x80004002
err:ole:create_server class {172bddf8-ceea-11d1-8b05-00600806d9b6} not
registered
fixme:ole:CoGetClassObject CLSCTX_REMOTE_SERVER not supported
err:ole:CoGetClassObject no class object {172bddf8-ceea-11d1-8b05-00600806d9b6}
could be created for context 0x15

Оболочка 1С сообщает о возникшей ошибке и предлагает закрыть программу.
Comment 1 Константин Кондратюк 2009-03-23 14:59:16 MSK
[перенесено из #3066]

Добавили в wine библиотеку wbemdisp. Пользы это
никакой не принесло.

В библеотеке сделаны ISWbemLocator и ISWbemServices. 
Ещё запрашивается IConnectionPointContainer и
несколько других интерфейсов.

На данный момент падает в модуле 1С после
обращения к IClassFactory_QueryInterface с riid, равным NULL
(!)
Так не бывает, на этом идеи пока
закончились...
Comment 2 Константин Кондратюк 2009-03-24 13:18:55 MSK
В wbemprox_IClassFactory_QueryInterface передаются riid и ppvObj, равные null.
Если выделять память под ppvObj и записывать туда значение (например, какой-нибудь интерфейс), то падает при попытке обратиться к нему. 
Если сделать 
*ppvObj = NULL;
то падает при чтении нулевого адреса.
Comment 3 Константин Кондратюк 2009-03-24 13:21:23 MSK
Скорее, проблему нужно искать в том, что при выполнении программы библиотеке вообще приходит подобная задача (тем более, с такими странными указателями).
А падение дальше - лишь следствие того, что почему-то этот QueryInterface вызван в этот момент.
Comment 4 Константин Кондратюк 2009-03-24 18:16:53 MSK
Нужен тест, воспроизводящий проблему.
В существующем тесте (в отличие от 1С) не вызывается ConnectServer и не получается интерфейс ISWbemServices.
Comment 5 Константин Кондратюк 2009-03-24 18:37:16 MSK
Воспроизведение - в бутылке rt/9051-2

wbemdisp является ссылкой на библиотеку в моём проекте:
/srv/kondratyuk/Projects/wine/dlls/wbemdisp/wbemdisp.tlb
Comment 6 Синицын Иван 2009-03-24 22:32:01 MSK
(In reply to comment #4)
> Нужен тест, воспроизводящий проблему.
> В существующем тесте (в отличие от 1С) не
> вызывается ConnectServer и не получается
> интерфейс ISWbemServices.
> 
Тест на vbs правельный, но для того чтобы получить services надо знать строку подключения....те самые строки с мусором что мы получали из 1С.
 как только выясним строку подключения, необходимо просто добавить параметры подключения со строкой вот в эту строку и должно заработать

Set wbemServices = wbemlocator.ConnectServer <Сюда добавить параметры через запятую>
Comment 7 Константин Кондратюк 2009-03-25 16:33:16 MSK
Глупая ошибка. Унаследовали SWbemLocator от IUnknown вместо IDispatch. Поэтому функция, к которой обращается программа стала вместо GetTypeInfoCount - ConnectServer.

Переделал на IDispatch, попутно дополнив интерфейс пропущенным в конце методом...
Comment 8 Константин Кондратюк 2009-03-25 17:07:20 MSK
QueryInterface возвращал SWbemLocator при запросе IConnectionPointContainer.
Далее предполагался метод Enum..., который у нас заменялся на GetTypeInfoCount. Возвращаемая единица представлялась адресом интерфейса, после чего программа просто падала.

Исключил все левые IID из SWbemLocator_QueryInterface. Падать перестало, смотрим дальше...
Comment 9 Константин Кондратюк 2009-03-25 17:29:32 MSK
Запрашиваются (в порядке появления в логах):

00000126-0000-0000-c000-000000000046 (IRunnableObject)
e7210190-61f4-11d4-941d-008048da11f9
fd7b6cc3-dc8e-11d2-b8d0-008048da0335
b196b283-bab4-101a-b69c-00aa00341d07 (IProvideClassInfo)
a6ef9860-c720-11d0-9337-00a0c90dcaa9 (IDispatchEx)
Comment 10 Константин Кондратюк 2009-03-25 18:14:00 MSK
Попробуем добавить IProvideClassInfo для начала. Программа пытается получить ITypeInfo через IProvideClassInfo::GetClassInfo
Comment 11 Константин Кондратюк 2009-03-25 19:54:09 MSK
Добавил IProvideClassInfo

1С падает при обращении по нулевому указателю после вызова IProvideClassInfo:GetClassInfo. Вроде мы не возвращаем нигде нулей...
Comment 12 Константин Кондратюк 2009-03-25 20:43:56 MSK
Не вижу ничего (кроме wbemprox_ISWbemLocator_QueryInterface), откуда мог бы возвращаться левый указатель...

При возврате ненулевого значения в *ppvObj падает именно при переходе к этому значению-адресу, игнорируя возвращаемые E_NOINTERFACE. С нулём, похоже, то же самое.
Comment 13 Константин Кондратюк 2009-03-26 13:23:43 MSK
IRunnableObject добавлен
В нём вызывается метод Run, имеющий только входные параметры. Что бы мы ни возвращали - программе всё равно.

Падает по-прежнему...
Comment 14 Константин Кондратюк 2009-03-26 13:29:07 MSK
Остались только эти два (неизвестных) интерфейса:
{e7210190-61f4-11d4-941d-008048da11f9}
{fd7b6cc3-dc8e-11d2-b8d0-008048da0335}

Падения носят случайный характер, то read, то write, то unhandled exception...

Есть вариант - создать левый интерфейс с множеством методов (func1, func2, func3) и посмотреть, что же хочет программа от них. Или хотя бы - в каком интерфейсе будет падать.
Comment 15 Константин Кондратюк 2009-03-26 17:29:15 MSK
В виндовом WbemScripting не существует (не поддерживается через SWbemLocator):
IDispatchEx
IRunnableObject
ISWbemServices
e7210190-61f4-11d4-941d-008048da11f9
fd7b6cc3-dc8e-11d2-b8d0-008048da0335

Убрал лишнее, оставив только ISWbemLocator и IProvideClassInfo
Comment 16 Константин Кондратюк 2009-03-27 11:44:46 MSK
Скорее всего, проблема в IProvideClassInfo_GetClassInfo.
Нынешний хак на его реализацию приводит к падениям. Нужно переделывать.
Совсем без реализации - сообщение "Ошибка OLE" от 1С...
Comment 17 Константин Кондратюк 2009-03-27 12:13:41 MSK
С результатами теста немного поторопился, IDispatchEx существует, нужно сделать и посмотреть, что к чему...
Comment 18 Константин Кондратюк 2009-03-27 12:30:16 MSK
IDispatchEx запрашивается, но никак не используется. Так что его делать рано.
Comment 19 Константин Кондратюк 2009-03-27 16:25:04 MSK
Появилась заглушка для IDispatchEx.
Только вот 1ска её всё-таки игнорирует - запрашивает, получает, а потом не использует.
Comment 20 Синицын Иван 2010-01-14 21:49:46 MSK
Возможно стоит задуматься о использовании midl, а не widl....поможет решить ряд проблем, таких как параметр lcid и раннее и позднее связывание меньшими затратами. А если еще ее написать на плюсах, то будет быстрее ( в смысле времени на разработку ).
Comment 21 Vitaly Lipatov 2012-01-18 03:08:34 MSK
Откладываем, bugs@ в ближайшее время делать ничего не будет.
Comment 22 Олег Шевченко 2024-03-20 23:18:56 MSK
Задача относится к релизу 2.1. , который больше не поддерживается. Аннулирую.