我正在使用下面的代码来创建一个我已经开发并注册的 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是我让它工作所需的全部内容吗?