OE>Написал JavaScript, оформил как COM объект, как описано в Создании COM-компонентов с помощью скриптовых языков
Автор(ы):
Дата: 25.04.2001
, зарегистрировал (успешно, проверил в OleView), создал для него tlb (тоже видна в OleView).

OE>Теперь хочу попользовать.
OE>В программе (C++,ATL/WTL) пишу
#import "C:\Scripts\scriptlet.tlb" no_namespace, named_guids

OE>пытаюсь поднять:
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, а изобразить что-то типа:

IDispatchPtr pDispatch;
HRESULT hr = pDispatch.CreateInstance( "MyScript.WSC" );

if ( SUCCEEDED( hr ) )
{
    CComDispatchDriver  pDd( pDispatch );
    _variant_t result;
    _variant_t param("123456");
    hr = pDd.Invoke1(OLESTR("MethodName"), &param, &result);

    ...
Автор: Odi$$ey    Оценить