OE>вопрос — кто виноват и что делать?
Как временную затычку могу посоветовать заменить в сгенерённом файле ID интерфейса на ID IDispatch-а.
Тоесть на "00020400-0000-0000-C000-000000000046"
OE>struct __declspec(uuid("b0dcdb31-6618-4d0e-b8ec-2a23382b67dc"))
OE>/* dispinterface */ Automation;
OE>...
OE>_COM_SMARTPTR_TYPEDEF(Automation, __uuidof(Automation));
OE>...
OE>вопрос — кто виноват и что делать?
Проблема в __uuidof(Automation). У меня в подобной ситуации генерит __uuidof(IDispatch), что более соответствует природе вещей.
Скрипт каждый раз генерит новую TLB и новый интерфейс, ибо параметров для LIBID и IID нет, так ведь? И скорее всего просто не регистрирует ни TLB, ни интерфейсы в ней.
Здравствуйте, Vi2, Вы писали:
Vi2>У меня в подобной ситуации генерит __uuidof(IDispatch), что более соответствует природе вещей.
э-э, что значит "у меня ... генерит" ? у тебя #import по другому работает?
Vi2>Скрипт каждый раз генерит новую TLB и новый интерфейс, ибо параметров для LIBID и IID нет, так ведь? И скорее всего просто не регистрирует ни TLB, ни интерфейсы в ней.
, зарегистрировал (успешно, проверил в OleView), создал для него tlb (тоже видна в OleView). Теперь хочу попользовать. OE>В программе (C++,ATL/WTL) пишу
что самое противное, из JavaScript все правильно отрабатывает буквально на двух строчках:
var test = new ActiveXObject("MyScript.WSC");
WScript.Echo(test.Method1("123456"));
Vi2>У меня в подобной ситуации генерит __uuidof(IDispatch), что более соответствует природе вещей.
OE>э-э, что значит "у меня ... генерит" ? у тебя #import по другому работает?
Наверное. Посмотри на дату и наличие IDispatch. Это пример с coolObj.wsc, который где-то был здесь на Форуме:
После выполнения в C:\FORUMS\ALERT\
Vi2>>У меня в подобной ситуации генерит __uuidof(IDispatch), что более соответствует природе вещей.
OE>>э-э, что значит "у меня ... генерит" ? у тебя #import по другому работает?
Vi2>Наверное. Посмотри на дату и наличие IDispatch. Это пример с coolObj.wsc, который где-то был здесь на Форуме:
Vi2>
Vi2>// Created by Microsoft (R) C/C++ Compiler Version 12.00.8447.0 (c3cb88f9).
Vi2>
у меня
// Created by Microsoft (R) C/C++ Compiler Version 13.10.3077 (34e1d069).
OE>версия VC какая?
Пробовал на шестерке, компилер 12-й. Но как я понимаю, генерация tlb и регистрация компоненты не должна зависеть от студии.
Впрочем, могу проверить и семерку...
OE>ProgId, TypeLib, Version — все есть, смотрел OleView
Что насчет clsid ? У меня он был урезанный после генерации и регистрации tlb.
Здравствуйте, Odi$$ey, Вы писали:
OE>вопрос — кто виноват и что делать?
12 компилятор вставляет строчку __uuidof(IDispatch) в определение смарт-пойнтера. Объект создается, интерфейс query-ться.
13 компилятор вставляет строчку __uuidof(Application), из-за чего такой интерфейс из объекта не достается. Что логично, поскольку scrobj.dll создает объект, поддерживающий только с IDisaptch.
Также интересно еще вот что. При генерации tlh в методы добавляется некий параметр, хотя в wsc он не объявляется. Собственно, вызвать метод объекта (объявленный в tli) не получается ни в семерке, ни в шестерке. Вызов падает с ошибкой 0x800a01c2.
Вызов напрямую Invoke через dispid без указания этого дополнительного параметра прекрасно работает и возвращает результаты...
Здравствуйте, rus blood, Вы писали:
RB>Также интересно еще вот что. При генерации tlh в методы добавляется некий параметр, хотя в wsc он не объявляется. Собственно, вызвать метод объекта (объявленный в tli) не получается ни в семерке, ни в шестерке. Вызов падает с ошибкой 0x800a01c2.
О! раз уж у тебя в 6-ке объект поднимается, можешь попробовать вызвать к-л метод, добавив этот еще один параметр (просто пустой variant)?
, зарегистрировал (успешно, проверил в OleView), создал для него tlb (тоже видна в OleView). OE>Теперь хочу попользовать. OE>В программе (C++,ATL/WTL) пишу
AutomationPtr pMyScriptPtr = NULL;
HRESULT hr;
hr = pScriptPtr.CreateInstance( "MyScript.WSC" ); // ProgID как он есть в скрипте и в OleView
OE>результат — ошибка 0x80004002: "No such interface supported" OE>вопрос — кто виноват ...
вообщем почитал я microsoft.public.scripting.scriptlets, было приятно, что хожу по граблям не в одиночестве , там некто Michael Harris (Microsoft.MVP.Scripting) не устает бедолага повторять:
You *can't* early bind to a WSC instance. The problem is that the IID of a WSC instance is dynamic and is determined at runtime by the scrobj.dll wrapper. The IID embedded in the typelib for a WSC that VB (or any other early bound language) looks for with QueryInterface will never match the dynamic IID of the instance at runtime.
The WSC documentation that implies that WSC early binding is supported is simply wrong.
причем, если для скрипта без событий VC еще делает #import, хотя потом ничего не работает, то при добавлении в скрипт event-ов по этой же причине происходит fatal error C1196: 'Scriptlet Event Source' : identifier found in type library xxxx is not a valid C++ identifier
OE>... и что делать?
Так что похоже самый простой выход не делать никакого #import-a, а изобразить что-то типа: