0

我正在使用下面的代码来创建一个我已经开发并注册的 COM 组件。

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

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

第一行运行良好,而如果我更改ProgID(即传递给ActiveXObject的字符串),我会收到消息Automation server can't create object。这表明至少注册机制的基础工作正常。

我将一些日志调用集成到 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是我让它工作所需的全部内容吗?

4

0 回答 0