c# - porque - ¿Cómo diagnosticar causa, solución o solucionar el error relacionado con Adobe ActiveX/COM 0x80004005 de forma progmática?
flash player firefox (3)
Ok, respondiendo para responder mi propia pregunta.
El problema estaba directamente relacionado con la configuración de ''Mostrar PDF en el navegador'' en Preferencias> Internet. Con esta opción marcada, el problema desaparece. Cuando no está marcado, regresa.
Aquí es cómo proponemos manejarlo programáticamente:
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
}
}
}
}
Algunos elementos a tener en cuenta:
- Según estos dos artículos, la clave puede estar en dos ubicaciones diferentes en el registro (Originals vs AdobeViewer): http://support.adobe.com/devsup/devsup.nsf/docs/51722.htm http: // support.adobe.com/devsup/devsup.nsf/docs/53556.htm
¿Alguien sabe si estas ubicaciones son intercambiables en todas las versiones o si, según las versiones específicas de Acrobat, la clave de registro se encuentra en diferentes ubicaciones? ¿Sigue Reader la misma lógica que Acrobat?
- ¿Adobe utiliza algún otro método para determinar la ''aplicación predeterminada de Adobe para abrir archivos PDF'' que no sea la asociación de archivos de Windows? Pregunto porque si tiene un producto que no es Adobe, como FoxIt instalado como la aplicación de asociación de archivos predeterminada, pero está usando el control ActiveX para Adobe en una máquina que tiene instalados tanto Reader como Acrobat, qué lógica se usa para decidir qué aplicación el objeto COM hablará con?
Creé una aplicación C # .NET que usa el control Adobe ActiveX para mostrar un PDF.
Se basa en un par de archivos DLL que se envían con la aplicación. Estas DLL interactúan con Adobe Acrobat o Adobe Acrobat Reader instalados localmente en la máquina.
Esta aplicación ya está siendo utilizada por algunos clientes y funciona muy bien para casi todos los usuarios (compruebo para ver que la máquina local ya se está ejecutando al menos la versión 9 de Acrobat o Reader).
He encontrado 3 casos en los que la aplicación devuelve el mensaje de error "Error HRESULT E_FAIL ha sido devuelto por una llamada a un componente COM" al intentar cargar (cuando se está cargando el control activex).
Revisé una de las máquinas de estos usuarios y tiene instalado Acrobat 9 y lo usa con frecuencia sin problemas. Parece que Acrobat 7 y 8 se instalaron al mismo tiempo ya que hay entradas para ellos en el registro junto con Acrobat 9.
No puedo reproducir este problema localmente, así que no estoy seguro de qué dirección tomar.
El error en la parte superior de stacktrace es: System.Runtime.InteropServices.COMException (0x80004005): Error HRESULT E_FAIL ha sido devuelto desde una llamada a un componente COM.
Algunas investigaciones sobre este error indican que es un problema de registro.
¿Alguien tiene una idea de cómo solucionar o solucionar este problema, o determinar cómo llegar al origen del problema?
El contenido completo del mensaje de error es este:
System.Runtime.InteropServices.COMException (0x80004005): Error HRESULT E_FAIL ha sido devuelto desde una llamada a un componente COM. en System.Windows.Forms.UnsafeNativeMethods.CoCreateInstance (Guid & clsid, Object punkOuter, contexto Int32, Guid & iid) en System.Windows.Forms.AxHost.CreateWithoutLicense (Guid clsid) en System.Windows.Forms.AxHost.CreateWithLicense (licencia de cadena , Guid clsid) en System.Windows.Forms.AxHost.CreateInstanceCore (Guid clsid) en System.Windows.Forms.AxHost.CreateInstance () en System.Windows.Forms.AxHost.GetOcxCreate () en System.Windows.Forms.AxHost .TransitionUpTo (estado de Int32) en System.Windows.Forms.AxHost.CreateHandle () en System.Windows.Forms.Control.CreateControl (Boolean fIgnoreVisible) en System.Windows.Forms.Control.CreateControl (Boolean fIgnoreVisible) en System.Windows .Forms.AxHost.EndInit () en AcrobatChecker.Viewer.InitializeComponent () en AcrobatChecker.Viewer..ctor () en AcrobatChecker.Form1.btnViewer_Click (Object Sender, EventArgs e) en System.Windows.Forms.Control.OnClick (EventArgs e) en System.Windows.Forms.Button.OnClick (EventArgs e) en System.Wind ows.Forms.Button.OnMouseUp (MouseEventArgs mevent) en System.Windows.Forms.Control.WmMouseUp (Message & m, botón MouseButtons, clics Int32) en System.Windows.Forms.Control.WndProc (Message & m) en System.Windows. Forms.ButtonBase.WndProc (Message & m) en System.Windows.Forms.Button.WndProc (Message & m) en System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Message & m) en System.Windows.Forms.Control.ControlNativeWindow. WndProc (Message & m) en System.Windows.Forms.NativeWindow.Callback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Para mi sistema (Windows XP, Adobe Reader 9.3.2) su solución no funcionó (pero me dio suficiente inspiración, ¡MUCHAS GRACIAS!)
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''");
}
}
Muchas gracias!
Solo quiero agregar que también puedo reproducir el comportamiento con Adobe Reader XI. (Windows XP 32 bit - VB.net 2005.)
La clave de registro es (*):
HKEY_CURRENT_USER/Software/Adobe/Acrobat Reader/11.0/Originals/bBrowserIntegration
Si ese valor clave es 1, el componente activex está correctamente instanciado. Si ese valor de clave es 0, obtengo la excepción en la creación de instancias de formularios.
No pude encontrar la opción de integración del navegador en la página de propiedades de Internet de Adobe Reader XI.
(*) Encontré ese valor en esta página: http://forums.adobe.com/thread/1042774