看起来像COM对象已创建,但JScript无法获得引用

时间:2013-07-01 10:19:42

标签: c++ dll com jscript

我正在使用以下代码创建我已开发和注册的COM组件。

var mycom = new ActiveXObject("Mirabilis.ComponentServices.1");

mycom.SetFirstNumber(5);
mycom.SetSecondNumber(3);

第一行运行正常,而如果我改变 ProgID (即传递给 ActiveXObject 的字符串),我收到消息自动化服务器可以' t创建对象。这表明至少注册机制的基础工作正常。

我将一些日志记录调用集成到DLL中。当我运行脚本时,我得到了日志文件中的证据,这个调用都强调了 QueryInterface

STDAPI DllGetClassObject(
    const CLSID &clsid,
    const IID &iid,
    void **ppv)
{
    ...
        CAddFactory *pAddFact = new CAddFactory;
        ...
        HRESULT hr = pAddFact->QueryInterface(iid, ppv);

        if (hr == S_OK)
            writeToLogFile("Class QueryInterface returned S_OK");
        else
            writeToLogFile("Class QueryInterface failed");

        return hr;
    ...
}

和这一个:

HRESULT __stdcall CAddFactory::CreateInstance(
    IUnknown *pUnknownOuter,
    const IID &iid,
    void **ppv)
{
    ...
        CAddObj *pObject = new CAddObj;
        ...
        HRESULT hr = pObject->QueryInterface(iid, ppv);

        if (hr == S_OK)
            writeToLogFile("Object QueryInterface returned S_OK");
        else
            writeToLogFile("Object QueryInterface failed");

        return hr;
    ...
}

返回 S_OK 。但是,当JScript到达脚本的第3行时,我收到以下错误消息:

'mycom' is null or not an object

为什么会这样?看起来JScript应该能够获得引用。

我做了一些尝试

  • 我尝试从 DllCanUnloadNow 返回 S_FALSE ,以确保不会卸载DLL,以防万一,但没有运气。

更新

我应该回顾一些COM / OLE / ActiveX理论......通过添加日志记录调用,我发现JScript很可能能够获得对COM对象的引用,并且总共有6个 QueryInterface 调用它,它们都失败。其中可能有一种尝试检索IDispatch,这对于脚本语言使用的对象是必需的。您是否认为实施 IDispatch 是我需要的所有工作?

0 个答案:

没有答案