C++ 为什么不能从文档中调用新添加的COM方法?

C++ 为什么不能从文档中调用新添加的COM方法?,c++,com,bho,idl,coclass,C++,Com,Bho,Idl,Coclass,我正在写一个BHO,它通过COM公开了许多方法。它们大多数工作正常,但最近添加的两个显示出奇怪的行为 当从页面上的JavaScript调用时,新添加的方法“返回”未定义,而不是抛出方法或属性不存在的异常,因此对象至少知道方法在其上,但从不执行它们 bho.h 我的IDL: [ object, uuid(/*uuid/*), dual, nonextensible, helpstring("IBho Interface"), pointer_

我正在写一个BHO,它通过COM公开了许多方法。它们大多数工作正常,但最近添加的两个显示出奇怪的行为

当从页面上的JavaScript调用时,新添加的方法“返回”未定义,而不是抛出方法或属性不存在的异常,因此对象至少知道方法在其上,但从不执行它们

bho.h

我的IDL:

[
    object,
    uuid(/*uuid/*),    
    dual,
    nonextensible,
    helpstring("IBho Interface"),
    pointer_default(unique)
]
interface IBho : IDispatch{
    ...
    [id(5), helpstring("method DeletePreference")] HRESULT DeletePreference([in] BSTR prefName);
};

[
    uuid(/*uuid*/),
    version(1.0),
    helpstring("Bho1.0 Type Library")
]
library MyBhoLib
{
    importlib("stdole2.tlb");
    [
        uuid(36BA1FA3-144A-4A1A-BE62-8301C4E4ADEF),     
        helpstring("Bho Class")
    ]
    coclass BhoSite
    {
        [default] interface IBho;
    };
}
我注意到,通过更改周围的ID可以创建类似的行为,我尝试通过定义要实现的新接口来“重置”类型库,更改GUID,增加类型库版本,等等。所有这些都导致方法根本不可调用


就我在这里和MSDN上花费的研究所知,我走的是正确的道路。如何成功地将新方法添加到COM类中,以便在BHO对象上调用它们?BHO还没有发布,因此界面还没有完全固定。

我能够解决这个问题,但我不能完全理解。IBho接口似乎只支持IDL公开的4种方法。之后,调用方可以看到这些方法,但不会执行。我不知道这是为什么,而且还没有找到任何文档来说明这一点

为了解决这个问题,我只是创建了一个新的COM类来管理存储,并通过IDL和注册过程将其公开给COM。这使我能够扩展与存储相关的API,以包括
DeletePreference
方法,并向BHO添加其他请求的功能。无论如何,这可能是更好的编码实践。这是现在的样子:

偏好

class CPreferences :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CPreferences, &CLSID_Preferences>,
    public IDispatchImpl<IPreferences , &IID_IPreferences >
{
    ...
    /implementation
};

您是否尝试注销并再次注册DLL?尝试使用regsvr32注册或注销会引发错误。然而,用于部署BHO的WIX MSI项目处理dll的注册。此外,向该项目中定义的另一个接口添加方法也可以正常工作。这可能与我在接口1上使用了ABC方法,在接口2上添加了一些方法,然后又试图在接口1上添加一些方法有关吗?
[
    object,
    uuid(/*uuid/*),    
    dual,
    nonextensible,
    helpstring("IBho Interface"),
    pointer_default(unique)
]
interface IBho : IDispatch{
    ...
    [id(5), helpstring("method DeletePreference")] HRESULT DeletePreference([in] BSTR prefName);
};

[
    uuid(/*uuid*/),
    version(1.0),
    helpstring("Bho1.0 Type Library")
]
library MyBhoLib
{
    importlib("stdole2.tlb");
    [
        uuid(36BA1FA3-144A-4A1A-BE62-8301C4E4ADEF),     
        helpstring("Bho Class")
    ]
    coclass BhoSite
    {
        [default] interface IBho;
    };
}
class CPreferences :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CPreferences, &CLSID_Preferences>,
    public IDispatchImpl<IPreferences , &IID_IPreferences >
{
    ...
    /implementation
};
[
    object,
    uuid(/*uuid/*),    
    dual,
    nonextensible,
    helpstring("IBho Interface"),
    pointer_default(unique)
]
interface IBho : IDispatch{
    ...
    [id(4), helpstring("method DoSomeThing")] HRESULT DoSomeThing([in] BSTR prefName);
};

[
    object,
    uuid(/*uuid/*),    
    dual,
    nonextensible,
    helpstring("IPreferences Interface"),
    pointer_default(unique)
]
interface IPreferences : IDispatch{
    ...
    [id(3), helpstring("method DeletePreference")] HRESULT DeletePreference([in] BSTR prefName);
};

[
    uuid(/*uuid*/),
    version(1.0),
    helpstring("Bho1.0 Type Library")
]
library MyBhoLib
{
    importlib("stdole2.tlb");
    [
        uuid(36BA1FA3-144A-4A1A-BE62-8301C4E4ADEF),     
        helpstring("Bho Class")
    ]
    coclass BhoSite
    {
        [default] interface IBho;
    };
    [
        uuid(uuid),     
        helpstring("Preferences Class")
    ]
    coclass Preferences 
    {
        [default] interface IPreferences;
    };
}