Как удалить кнопку надстройки MS Word? - PullRequest
0 голосов
/ 26 мая 2009

Мне нужно программно удалить надстройку из MS Word. Я удалил соответствующую запись в реестре, кнопка теперь отключена (при нажатии ничего не происходит) и надстройка больше не отображается в списке надстроек COM.

Однако эта кнопка остается в меню ленты надстроек. Как я могу удалить это программно?

1 Ответ

1 голос
/ 02 июня 2009

Нет ответов через неделю. Вы можете сказать, это ленивый вопрос, не так ли?

В настоящее время я использую решение из 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();

Надеюсь, это поможет другим с подобной проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...