Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-01-2008
Avatar de kotai
kotai kotai is offline
Miembro
 
Registrado: mar 2004
Ubicación: Gandia
Posts: 31
Poder: 0
kotai Va por buen camino
Hola de nuevo.

Pues todas las funciones que he encontrado son para pasar de String a String.

Al final he decidido hacerlo por condición en el compilador {$IFDEF ....} {$ENDIF} y que solo funcione con WinXP, Win2003 o Win Vista pero no se como detectar eso en tiempo de compilación.

¿ Que debería poner en el {$IFDEF ....} para que solo se compile cuando sea un WinXP o superior ?

Gracias.
Responder Con Cita
  #2  
Antiguo 15-01-2008
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Una solución puede ser comprobar la existencias de las funciones antes de utilizarlas, para eso vamos a cargarlas de forma dinámica en vez de vincularlas a nuestro programa de forma estática, y si no las encontramos lanzamos una excepción que deberás de manejar en tu programa utilizando un bloque try ... except.

La cosa queda mas o menos así:
Código Delphi [-]
unit base64;

interface

uses Windows, SysUtils, Classes;

function BinToStr(Binary: PByte; Len: Cardinal): String;
procedure StrToStream(Str: String; Stream: TStream);

implementation

const
  CRYPT_STRING_BASE64HEADER = 0;
  CRYPT_STRING_BASE64 = 1;
  CRYPT_STRING_BINARY = 2;
  CRYPT_STRING_BASE64REQUESTHEADER = 3;
  CRYPT_STRING_HEX = 4;
  CRYPT_STRING_HEXASCII = 5;
  CRYPT_STRING_BASE64X509CRLHEADER = 9;
  CRYPT_STRING_HEXADDR = 10;
  CRYPT_STRING_HEXASCIIADDR = 11;
  CRYPT_STRING_HEXRAW = 12;
  CRYPT_STRING_NOCRLF = $40000000;
  CRYPT_STRING_NOCR = $80000000; 

function BinToStr(Binary: PByte; Len: Cardinal): String;
var
  Dll: HModule;
  Count: DWORD;
  CryptBinaryToString: function (pbBinary: PByte; cbBinary: DWORD; dwFlags: DWORD;
    pszString: PChar; var pcchString: DWORD): BOOL; stdcall;
begin
  Dll:= LoadLibrary('Crypt32.dll');
  if Dll <> 0 then
  try
    @CryptBinaryToString:= GetProcAddress(Dll,'CryptBinaryToStringA');
    if @CryptBinaryToString <> nil then
    begin
      Count:= 0;
      if CryptBinaryToString(Binary,Len,12,nil,Count) then
      begin
        SetLength(Result,Count);
        if not CryptBinaryToString(Binary,Len,12,PChar(Result),
          Count) then
          Result:= EmptyStr;
      end;
    end else
      raise Exception.Create('No encuentro CryptBinaryToStringA');
  finally
    FreeLibrary(Dll);
  end else
    raise Exception.Create('No encuentro Crypt32.dll');
end;

procedure StrToStream(Str: String; Stream: TStream);
var
  Dll: HModule;
  Buffer: PByte;
  Count: DWORD;
  CryptStringToBinary: function (pszString: PChar; cchString: DWORD; dwFlags: DWORD;
    pbBinary: PByte; var pcbBinary: DWORD; pdwSkip: PDWORD;
    pdwFlags: PDWORD): BOOL; stdcall;
begin
  Dll:= LoadLibrary('Crypt32.dll');
  if Dll <> 0 then
  try
    @CryptStringToBinary:= GetProcAddress(Dll,'CryptStringToBinaryA');
    if @CryptStringToBinary <> nil then
    begin
      Count:= 0;
      if CryptStringToBinary(PChar(Str),Length(Str),CRYPT_STRING_BASE64,nil,Count,
        nil,nil) then
      begin
        GetMem(Buffer,Count);
        try
          if CryptStringToBinary(PChar(Str),Length(Str),CRYPT_STRING_BASE64,Buffer,
            Count,nil,nil) then
            Stream.WriteBuffer(Buffer^,Count);
        finally
          FreeMem(Buffer);
        end;
      end;
    end else
      raise Exception.Create('No encuentro CryptStringToBinaryA');
  finally
    FreeLibrary(Dll);
  end else
    raise Exception.Create('No encuentro Crypt32.dll');
end;

end.

Y cuando la uses utiliza algo como esto:
Código Delphi [-]
try
  BinToStr( ...
except
  // Si llegamos hasta aqui es que las funciones no existen
end;

¿Que te parece? es solo una improvisación pero puede servir.
Responder Con Cita
  #3  
Antiguo 16-01-2008
Avatar de kotai
kotai kotai is offline
Miembro
 
Registrado: mar 2004
Ubicación: Gandia
Posts: 31
Poder: 0
kotai Va por buen camino
Muchas gracias, va perfecto.

Pues no me quedan cosas que aprender de delphi....

Saludos.
Responder Con Cita
  #4  
Antiguo 16-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cita:
Empezado por kotai Ver Mensaje
Pues no me quedan cosas que aprender de delphi....

Quisiera estar en tu situación... a mi me falta tanto por aprender...
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
Respuesta



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
stringGrid y bitmap cacu OOP 2 24-10-2007 18:11:03
Bitmap javikanin Gráficos 1 22-11-2004 13:32:15
Imagen a Bitmap bustio .NET 1 08-11-2004 14:29:19
Descargar bitmap... craven Gráficos 1 13-09-2003 13:27:22
propiedad bitmap ccampoy OOP 1 29-06-2003 22:16:17


La franja horaria es GMT +2. Ahora son las 15:11:37.


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