Ver Mensaje Individual
  #1  
Antiguo 29-09-2010
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.610
Reputación: 32
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
Función VariantCopy de OLEAut32.dll con variante varByRef (VT_BYREF)

Hola amigos.

Me encuentro investigando un raro comportamiento de la función VariantCopy contenida en la biblioteca OLEAut32.dll de Windows.

Su declaración en Delphi es:

Código Delphi [-]
function VariantCopy(var Dest: TVarData;
  const Source: TVarData): HRESULT; stdcall;

Según he podido comprobar, dicha función arroja el código de error DISP_E_BADVARTYPE (VAR_BADVARTYPE en Delphi) cuando el tipo de alguno de los variantes dados (Dest o Source) tiene la bandera VT_BYREF (varByRef en Delphi).

La única información específica que he encontrado sobre esto es un documento de PowerPoint que no puedo abrir con mi Office 2000 (por ser del nuevo formato .pptx), y en el cual tampoco he logrado encontrar lo que busco con Google Docs.

Este es el archivo: http://www.azimuthsecurity.com/resou...ith_dewey.pptx

El buscador de Google me muestra un resumen que dice:

Cita:
VariantCopy() is potentially unsafe when VT_BYREF is set! [...]
Básicamente me interesa conocer todo lo que el autor dice referente a esa función y a la bandera VT_BYREF, y sobremanera el párrafo que cité. Si alguien pudiera echarme una mano con este asunto, se lo agradecería.

Me pareció una buena idea pedírselos aquí, ya que este hilo pudiera servirle a alguien más que se topara con el mismo problema. La siguiente es una prueba muy simple que muestra el fallo mencionado (ejecutado en Windows XP al día con los parches):

Código Delphi [-]
Uses
  VarUtils;

procedure TForm1.Button1Click(Sender: TObject);
Var
  H :HResult;
  V1, V2 :Variant;
begin
  TVarData (V1).VType := varByRef;
  H := VariantCopy (TVarData (V1), TVarData (V2));
  VarResultCheck (H);
end;

En teoría y según algunos documentos, VariantCopy debería simplemente limpiar el variante destino antes de copiarle el origen, pero no ocurre eso. Por otra parte, no sé qué sucede con el sitio http://msdn.microsoft.com/ (¿saben si tuvo alguna caída este miércoles?).

Saludos.

Al González.
Responder Con Cita