Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Bibliotecas de código fuente > [GH Freebrary]
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-01-2014
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
"Bug" de automatización COM al usar WideChar como parámetro

Hola amigos.

Necesito que me ayuden a probar algo muy sencillo en versiones de Delphi de la 2009 en adelante. De momento sólo tengo XE2, en la cual he detectado lo que al parecer es un defecto de automatización relacionado con parámetros WideChar, pero no he tenido la suerte de encontrar información sobre si ya fue corregido el problema o en cuáles versiones de Delphi se presenta.

Una sentencia con la que pueden probar es:
Código Delphi [-]
OLEVariant (CreateOLEObject ('MSXML2.DOMDocument.6.0')).CreateElement ('a');
(debe estar la unidad COMObj en el Uses para poder usar CreateOLEObject)

Si aparece una excepción como "cadena clase no válida", pueden intentar con otro ProgID ('MSXML2.DOMDocument.3.0', 'Word.Application', etcétera). Lo importante es que en seguida se coloque el nombre de un método que sea válido para ese tipo de objeto (CreateElement es un método de DOMDocument), que dicho método espere un argumento de tipo cadena de caracteres y que pongan una cadena literal compuesta sólo por una letra.

Una instrucción como la anterior se ejecuta sin problemas en Delphi 7, mientras que en XE2 causa una excepción "Este nombre no puede empezar por el carácter...". Viendo el código máquina con la ventana CPU, encontré que Delphi 7 manda el carácter como String, mientras que XE2 lo manda como un Byte, por lo que XE2 requiere de una pequeña ayuda para evitar el error mencionado:
Código Delphi [-]
OLEVariant (CreateOLEObject ('MSXML2.DOMDocument.6.0')).CreateElement (String ('a'));
(el molde de tipo String ('a'))

Tradicionalmente, la automatización ha convertido los argumentos String y Char a WideString (el tipo usado en COM), pero XE2 no lo hace cuando la expresión es un carácter Char (WideChar), mientras que un valor de tipo ANSIChar sí lo convierte a WideString. Esto supone que cuando adaptaron el compilador a Unicode (Delphi 2009), tuvieron un descuido respecto a los valores de tipo WideChar usados en la automatización de tipo late binding. Lo bueno es que se soluciona con un simple molde de tipo.

Básicamente me interesa conocer desde qué versiones ocurre este problema y si ya fue corregido en lanzamientos posteriores a XE2. Así sabré qué ediciones de GHF deberán prevenirse empleando el molde de tipo "String (Valor)" (además de XE2), por no decir que este hilo, con la información que ustedes me ayudarán a completar, le será de ayuda a alguien más que se tope con el mismo problema.

Ruego a quien pueda hacer esa sencilla prueba, no lleva más de un par de minutos.

De antemano, gracias.

Al.

Última edición por Al González fecha: 09-01-2014 a las 19:25:20.
Responder Con Cita
  #2  
Antiguo 09-01-2014
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Estimado [Al Gonzalez]

Utilizando Delphi XE3 he colocado tu código en el onShow de un Form y no me arroja ningún error.
Espero que esto pueda servir.
Saludos
Responder Con Cita
  #3  
Antiguo 09-01-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Al.

En Delphi 7 la sentencia se ejecuta correctamente, sin elevar excepción alguna.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 09-01-2014
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Resuelto

Muchas gracias amigos.

La respuesta de radenf me dio una pista. Buscando "fixed bugs xe3" encontré esta lista de problemas corregidos en XE3: http://edn.embarcadero.com/article/42606

En la cual se incluye este informe de calidad: http://qc.embarcadero.com/wc/qcmain.aspx?d=67556

En él se describe el mismo problema que planteé anteriormente. Según se puede leer, éste fue encontrado en Delphi 2009 y estuvo presente hasta Delphi XE2, pues ahí dice "Resolved in Build: : 17.0.4625.53395" (XE3 es la versión 17 de Delphi).

Estoy por liberar la siguiente actualización de GHF para XE2, y en ella incluiré ciertas clases relacionadas con XML y Excel que ya tenía en la edición para Delphi 7. No obstante, primero había que probar que el código de dichas clases funcionaran bien en XE2, y así fue como me topé con el asunto del WideChar. Afortunadamente esto se presentaba en un sólo lugar del código, pero en adelante lo tendré previsto cuando use automatización en las versiones desde 2009 hasta XE2.

Pongo aquí el método en cuestión, ya con el molde de tipo y un puntual comentario (puede servir a otros para agregar esa misma nota cuando sea el caso):
Código Delphi [-]
  Function TghOpenXMLSpreadsheet.GetValue (Const ACell :String) :Variant;
  Var
    CellObj :OLEVariant;
  Begin
    CellObj := Cell (ACell);

    If VarIsClear (CellObj) Then
      Result := Null
    Else
    Begin
      Result := CellObj.SelectSingleNode ('_:v');

      If VarIsClear (Result) Then
        Result := Null
      Else
        { String type cell (value in sharedStrings.xml).  NOTE: The string
          type cast is necessary here to prevent automation bug with
          WideChar expressions (or literal strings of length 1) in Delphi
          2009-XE2 (quality report #67556). }
        If CellObj.GetAttribute (String ('t')) = 's' Then
          Result := Strs [Result.Text]
        Else  // Other types use direct values
          Result := Result.Text;
    End;
  End;

Tema resuelto, gracias y un saludo.

Última edición por Al González fecha: 09-01-2014 a las 19:30:55.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Usar TServerSocket y TClientSocket para enviar "streams" más o menos "grandes" dec Internet 9 04-08-2015 17:11:50
¿Cómo usar un "TOpenDialog" o similar en Delphi XE5 para Android? dec Desarrollo en Delphi para Android 2 18-09-2013 15:33:35
Firebir y usar "IF" en la clausula "SELECT" papulo SQL 6 25-07-2006 22:38:04
Cómo insertar "NULL" en un parametro de INSERT en SQL Joselito SQL 4 23-10-2005 01:17:35


La franja horaria es GMT +2. Ahora son las 19:59:22.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi