Как диагностировать причину, исправить или обойти ошибку, связанную с Adobe ActiveX / COM, 0x80004005 программно? - PullRequest
7 голосов
/ 26 марта 2010

Я создал приложение C # .NET, которое использует элемент управления Adobe ActiveX для отображения PDF.

Он опирается на пару библиотек DLL, которые поставляются вместе с приложением. Эти библиотеки DLL взаимодействуют с установленным на компьютере локальным приложением Adobe Acrobat или Adobe Acrobat Reader.

Это приложение уже используется некоторым клиентом и отлично работает почти для всех пользователей (я проверяю, что на локальном компьютере уже установлена ​​хотя бы версия 9 Acrobat или Reader).

Я обнаружил 3 случая, когда приложение возвращает сообщение об ошибке «Ошибка HRESULT E_FAIL возвращена при вызове COM-компонента» при попытке загрузки (при загрузке элемента управления activex).

Я проверил одну из машин этого пользователя, и у него установлен Acrobat 9, и он часто использует его без проблем. Похоже, что Acrobat 7 и 8 были установлены одновременно, поскольку для них есть записи в реестре вместе с Acrobat 9.

Я не могу воспроизвести эту проблему локально, поэтому я не знаю точно, в каком направлении идти.

Ошибка в верхней части трассировки стека: System.Runtime.InteropServices.COMException (0x80004005): Ошибка HRESULT E_FAIL возвращена после вызова компонента COM.

Некоторые исследования этой ошибки указывают на то, что это проблема реестра.

Кто-нибудь знает, как решить или обойти эту проблему, или определить, как добраться до сути проблемы?

Полный текст сообщения об ошибке:

System.Runtime.InteropServices.COMException (0x80004005): Ошибка HRESULT E_FAIL была возвращена после вызова компонента COM. в System.Windows.Forms.UnsafeNativeMethods.CoCreateInstance (Guid & clsid, объект punkOuter, контекст Int32, Guid & iid) в System.Windows.Forms.AxHost.CreateWithoutLicense (Guid clsid) в System.Windows.Forms.AxHost.CreateWithLicense (Строковая лицензия, Guid clsid) в System.Windows.Forms.AxHost.CreateInstanceCore (Guid clsid) в System.Windows.Forms.AxHost.CreateInstance () в System.Windows.Forms.AxHost.GetOcxCreate () в System.Windows.Forms.AxHost.TransitionUpTo (состояние Int32) в System.Windows.Forms.AxHost.CreateHandle () в System.Windows.Forms.Control.CreateControl (Boolean fIgnoreVisible) в System.Windows.Forms.Control.CreateControl (Boolean fIgnoreVisible) в System.Windows.Forms.AxHost.EndInit () в AcrobatChecker.Viewer.InitializeComponent () в AcrobatChecker.Viewer..ctor () в AcrobatChecker.Form1.btnViewer_Click (Отправитель объекта, EventArgs e) в System.Windows.Forms.Control.OnClick (EventArgs e) в System.Windows.Forms.Button.OnClick (EventArgs e) в System.Windows.Forms.Button.OnMouseUp (MouseEventArgs mevent) в System.Windows.Forms.Control.WmMouseUp (сообщение & m, кнопка MouseButtons, щелчки Int32) в System.Windows.Forms.Control.WndProc (сообщение & m) в System.Windows.Forms.ButtonBase.WndProc (сообщение & m) в System.Windows.Forms.Button.WndProc (сообщение & m) в System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Message & m) в System.Windows.Forms.Control.ControlNativeWindow.WndProc (Message & m) в System.Windows.Forms.NativeWindow.Callback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Ответы [ 3 ]

11 голосов
/ 01 апреля 2010

Хорошо, возвращаюсь, чтобы ответить на мой собственный вопрос.

Проблема была напрямую связана с настройкой «Отображать PDF в браузере» в «Предпочтения»> «Интернет». Если эта опция включена, проблема исчезнет. Когда он не проверен, он возвращается.

Вот как мы предлагаем обрабатывать это программно:

    private string defaultPdfProg()
    { //Returns the default program for opening a .pdf file; On Fail returns empty string. 
      // (see notes below) 
        string retval = "";

        RegistryKey pdfDefault = Registry.ClassesRoot.OpenSubKey(".pdf").OpenSubKey("OpenWithList");
        string[] progs = pdfDefault.GetSubKeyNames();
        if (progs.Length > 0)
        {
            retval = progs[1];
            string[] pieces = retval.Split('.'); // Remove .exe

            if (pieces.Length > 0)
            {
                retval = pieces[0];
            }
        }

        return retval;
    }

    private void browserIntegration(string defaultPdfProgram)
    { //Test if browser integration is enabled for Adobe Acrobat (see notes below)
        RegistryKey reader = null;
        string[] vers = null;

        if (defaultPdfProgram.ToLower() == "acrobat")
        { //Default program is Adobe Acrobat
            reader = Registry.LocalMachine.OpenSubKey("Software").OpenSubKey("Adobe").OpenSubKey("Adobe Acrobat");
            vers = reader.GetSubKeyNames();
        }
        else if (defaultPdfProgram.ToLower() == "acrord32")
        { //Default program is Adobe Acrobat Reader
            reader = Registry.LocalMachine.OpenSubKey("Software").OpenSubKey("Adobe").OpenSubKey("Acrobat Reader");
            vers = reader.GetSubKeyNames();
        }
        else
        {
            //TODO: Handle non - adobe .pdf default program
        }

        if (vers.Length > 0)
        {
            string versNum = vers[vers.Length - 1].ToString();
            reader = reader.OpenSubKey(versNum);
            reader = reader.OpenSubKey("AdobeViewer",true);

            Boolean keyExists = false;
            Double keyValue = -1;
            foreach(string adobeViewerValue in reader.GetValueNames())
            {
                if (adobeViewerValue.Contains("BrowserIntegration"))
                {
                    keyExists = true;
                    keyValue = Double.Parse(reader.GetValue("BrowserIntegration").ToString());
                }
            }

            if (keyExists == false || keyValue < 1)
            {
                string message = "This application requires a setting in Adobe to be changed. Would you like to attempt to change this setting automatically?";
                DialogResult createKey = MessageBox.Show(message, "Adobe Settings", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
                if (createKey.ToString() == "OK")
                {
                    reader.SetValue("BrowserIntegration", 1, RegistryValueKind.DWord);
                    //test to make sure registry value was set
                }
                if (createKey.ToString() == "Cancel")
                {
                    //TODO: Provide instructions to manually change setting
                }
            }
        }
    }

Несколько замечаний:

Кто-нибудь знает, являются ли эти местоположения взаимозаменяемыми во всех версиях или, если на основе определенных версий Acrobat раздел реестра находится в разных местах? Читатель придерживается той же логики, что и Acrobat?

  • Использует ли Adobe какой-либо другой метод для определения «приложения Adobe по умолчанию для открытия файлов PDF», кроме сопоставления файлов Windows? Я спрашиваю, потому что, если у вас есть продукт не Adobe, например FoxIt, установленный в качестве приложения для сопоставления файлов по умолчанию, но вы используете элемент управления ActiveX для Adobe на компьютере, на котором установлены Reader и Acrobat, какая логика используется для определения того, какое приложение с объектом COM будет разговаривать?
1 голос
/ 30 апреля 2010

Для моей системы (Windows XP, Adobe Reader 9.3.2) ваше решение не сработало (но вдохновило меня, СПАСИБО!)

private void browserIntegration(string defaultPdfProgram)
    {
        try
        {
            RegistryKey reader = null;
            string[] vers = null;

            #region Walters Versuch
            reader = Registry.CurrentUser.OpenSubKey("Software").OpenSubKey("Adobe");
            reader = reader.OpenSubKey("Acrobat Reader");
            vers = reader.GetSubKeyNames();
            if (vers.Contains<string>("9.0"))
            {
                reader = reader.OpenSubKey("9.0");
                reader = reader.OpenSubKey("Originals", true);
                if (reader.GetValueNames().Contains<string>("bBrowserIntegration"))
                    reader.SetValue("bBrowserIntegration", 1, RegistryValueKind.DWord);
                // wenn der Key fehlt ist Browserintegration auch angeschaltet
                // alternativ: reader.DeleteSubKey("bBrowserIntegration", false);
            }
            else
                MessageBox.Show(
                    "In case you run into problems later, please make sure yourself to select\n'Show PDF in Browser' in Acrobat Reader's Settings"
                    , "Unknown Version of Acrobat Reader");

            #endregion
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message + "\n" + ex.StackTrace
                + "\nIn case you run into problems later, please make sure yourself to select\n'Show PDF in Browser' in Acrobat Reader's Settings"
                , "Error while switching on 'Browserintegration' in 'Acrobat Reader'");
        }
}
0 голосов
/ 27 марта 2013

Спасибо большое!

Я просто хочу добавить, что я могу воспроизвести поведение и в Adobe Reader XI. (32-разрядная версия Windows XP - VB.net 2005 г.)

Раздел реестра (*):

HKEY_CURRENT_USER\Software\Adobe\Acrobat Reader\11.0\Originals\bBrowserIntegration

Если это значение ключа равно 1, компонент activex создается правильно. Если это значение ключа равно 0, я получаю исключение при создании экземпляра формы.

Мне не удалось найти параметр интеграции с браузером на странице свойств Интернета в Adobe Reader XI.

(*) Я нашел это значение на этой странице: http://forums.adobe.com/thread/1042774

...