我正在使用以下代码创建我已开发和注册的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应该能够获得引用。
我做了一些尝试
更新
我应该回顾一些COM / OLE / ActiveX理论......通过添加日志记录调用,我发现JScript很可能能够获得对COM对象的引用,并且总共有6个 QueryInterface 调用它,它们都失败。其中可能有一种尝试检索IDispatch,这对于脚本语言使用的对象是必需的。您是否认为实施 IDispatch 是我需要的所有工作?