【问题标题】:How can I remove a MS Word add-in button?如何删除 MS Word 加载项按钮?
【发布时间】:2009-06-17 17:55:50
【问题描述】:

我需要以编程方式从 MS Word 中删除加载项。我已经删除了与之对应的注册表项,并且该按钮现在被禁用(单击它时没有任何反应),并且该加载项不再出现在 COM 加载项列表中。

但是,该按钮仍保留在“加载项”功能区菜单中。如何以编程方式删除它?

【问题讨论】:

    标签: c++ ms-word


    【解决方案1】:

    一周后没有答案。你可以说这是一个懒惰的问题,不是吗?

    我目前正在使用来自CodeProject 的解决方案。我的代码似乎可以工作,但它还尚未经过正确测试

    CoInitialize(NULL);
    CLSID clsid;
    IDispatch *pWApp, *pCommandBars, *pCommandBar, *pCommandBarControls, *pCommandBarControl;
    VARIANT v;
    HRESULT hr;
    
    hr = CLSIDFromProgID(L"Word.Application", &clsid);
    if (SUCCEEDED(hr))
    {
    
        hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pWApp);
        if (SUCCEEDED(hr))
        {
            VariantInit(&v);
            hr = OLEMethod(DISPATCH_PROPERTYGET, &v, pWApp, L"Commandbars", 0);
            pCommandBars = v.pdispVal;
    
            VariantInit(&v);
            hr = OLEMethod(DISPATCH_PROPERTYGET, &v, pCommandBars, L"Count", 0);
            INT NumCommBars = v.intVal;
    
            for (INT i = 1; i <= NumCommBars; i++)
            {
                COleVariant CommandBarIndex((BYTE)i);
                VariantInit(&v);
                hr = OLEMethod(DISPATCH_PROPERTYGET, &v, pCommandBars, L"Item", 1, CommandBarIndex);
                if (FAILED(hr)) continue;
                pCommandBar = v.pdispVal;
    
                VariantInit(&v);
                hr = OLEMethod(DISPATCH_PROPERTYGET, &v, pCommandBar, L"Controls", 0);
                if (FAILED(hr)) continue;
                pCommandBarControls = v.pdispVal;
    
                VariantInit(&v);
                hr = OLEMethod(DISPATCH_PROPERTYGET, &v, pCommandBarControls, L"Count", 0);
                if (FAILED(hr)) continue;
                INT NumControls = v.intVal;
    
                for (INT j = 1; j <= NumControls; j++)
                {
                    COleVariant CommandBarControlIndex((BYTE)j);
                    VariantInit(&v);
                    hr = OLEMethod(DISPATCH_PROPERTYGET, &v, pCommandBarControls, L"Item", 1, CommandBarControlIndex);
                    if (FAILED(hr)) continue;
                    pCommandBarControl = v.pdispVal;
    
                    VariantInit(&v);
                    hr = OLEMethod(DISPATCH_PROPERTYGET, &v, pCommandBarControl, L"Caption", 0);
                    if (FAILED(hr)) continue;
    
                    CString ControlCaption(v.bstrVal);
    
                    if (ControlCaption.Find("MyCaption") != -1)
                    {
                        OLEMethod(DISPATCH_METHOD, NULL, pCommandBarControl, L"Delete", 0);
                    }
    
                    pCommandBarControl->Release();
                }
    
                pCommandBar->Release();
                pCommandBarControls->Release();
            }
    
            OLEMethod(DISPATCH_METHOD, NULL, pWApp, L"Quit", 0);
            pCommandBars->Release();
            pWApp->Release();
        }
    }
    
    CoUninitialize();
    

    希望这可以帮助其他有类似问题的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 1970-01-01
      相关资源
      最近更新 更多