C++ 看起来COM对象已创建,但JScript无法获取引用
我正在使用以下代码创建一个我已经开发和注册的COM组件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
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需要以某种方式发现可用的方法/属性,您需要朝着这个方向迈出一步。