Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 看起来COM对象已创建,但JScript无法获取引用_C++_Dll_Com_Jscript - Fatal编程技术网

C++ 看起来COM对象已创建,但JScript无法获取引用

C++ 看起来COM对象已创建,但JScript无法获取引用,c++,dll,com,jscript,C++,Dll,Com,Jscript,我正在使用以下代码创建一个我已经开发和注册的COM组件 var mycom = new ActiveXObject("Mirabilis.ComponentServices.1"); mycom.SetFirstNumber(5); mycom.SetSecondNumber(3); 第一行运行正常,但如果我更改ProgID(即传递给ActiveXObject的字符串),我会得到消息Automation server无法创建对象。这表明,至少登记机制的基础工作正常 我将一些日志调用集成到DL

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

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

mycom.SetFirstNumber(5);
mycom.SetSecondNumber(3);
第一行运行正常,但如果我更改ProgID(即传递给ActiveXObject的字符串),我会得到消息Automation server无法创建对象。这表明,至少登记机制的基础工作正常

我将一些日志调用集成到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\u OK。但是,当JScript到达脚本的第3行时,我会收到以下错误消息:

'mycom' is null or not an object
为什么会这样?看起来JScript应该能够获得一个引用

我做了一些尝试

  • 我试图从DllCanUnloadNow返回S_FALSE,以确保不会卸载DLL,以防万一,但运气不佳
更新


我应该复习一些COM/OLE/ActiveX理论。。。通过添加日志调用,我发现JScript很可能能够获取对COM对象的引用,并且总共对它进行了6次QueryInterface调用,但都失败了。其中可能有检索的尝试,这对于脚本语言使用的对象是必需的。你认为实现IDispatch是我工作所需要的一切吗?

Javascript(和VBScript)只能使用“自动化”接口,或者IDispatch接口是的。因此,您至少需要实现这些功能,但是使用ATL(如果您是Visual Studio用户)这样的库会更容易。如果您已经在MIDL中创建了COM接口,您可能可以将其设置为双接口,这使得IDispatch部分的实现非常简单(您可以使用类型库中自己的类型信息,直接调用
DispGetIdsOfNames
DispInvoke
等)您需要
IDispatch
+有效的类型信息/库,或者您需要
IDispatchEx
。JScript需要以某种方式发现可用的方法/属性,您需要朝着这个方向迈出一步。