Как я могу предварительно определить, вызовет ли доступ к свойству AccessViolation?

У меня есть метод в Rubberduck (надстройка VBE в процессе), который назначает рисунок и маску для CommandBarControl (Кнопка). Он хорошо работает при добавлении изображений в VBE Excel, Word и т. Д., Но не удается с нарушением доступа при добавлении изображений в SolidWorks VBE.

    public static void SetButtonImage(CommandBarButton button, Image image, Image mask)
    {
        button.FaceId = 0;
        if (image == null || mask == null)
        {
            return;
        }

        try
        {
            button.Picture = AxHostConverter.ImageToPictureDisp(image);
            button.Mask = AxHostConverter.ImageToPictureDisp(mask);
        }
        catch (COMException exception)
        {
            Logger.Debug("Button image could not be set for button [" + button.Caption + "]\n" + exception);
        }
    }

Я знаю из KB286460 - Как установить свойства маски и изображения для командных панелей Office XP

Свойства Mask и Picture определены как тип IPictureDisp, который является членом библиотеки Stdole. IPictureDisp использует методы, которые нельзя распределить через границы процесса. Поэтому свойства Маска и Изображение можно вызывать только в процессе (макросы VBA, надстройки автоматизации и библиотеки ActiveX выполняются в процессе).

Я знаю, как обрабатывать AccessViolationException, что я мог бы украсить метод с HandleProcessCorruptedStateExceptions атрибут, но я не думаю, что я хочу продолжать с поврежденным государством. Может быть, это испорченное государство доброкачественно, и я могу продолжать?

Интересно, что окно Autos Visual Studio обрабатывает Picture Доступ к исключению без проблем: введите описание изображения здесь

Кажется, что SolidWorks VBE почему-то не рассматривает / размещает Rubberduck как тот же процесс, что и CommandBarButtons. Это говорит о том, что другие хосты VBE могут делать то же самое.

РЕДАКТИРОВАТЬ Я не уверен, что это уместно, но я использую старую версию SolidWorks 2006 под Windows 10, и для ее запуска я настроил ее запуск с правами администратора.

Я знаю, что доступ к Picture / Mask Свойства будут вызывать AccessViolation, но как я могу определить, является ли свойство доступным для чтения / записи, прежде чем фактически пытаться получить к нему доступ?

Я мог бы проверить, является ли хост-приложение SolidWorks, но я бы предпочел более общий подход, который работает для любого хоста, который имеет такое же поведение.

0 ответов

Другие вопросы по тегам