Página 1 de 4
Codigo Fuente de Mdo Libre en Delphi distinto a version 7
Publicado: Mar Jul 06, 2010 10:13 pm
por Dado
ACTUALIZACION (30-SEP-2010)
POR FIN me di a la tarea de instalar TODAS las versiones de Delphi que tuve al alcance y comprobar lo que tan amablemente me habian reportado.
En esta entrada hice un resumen preciso de los cambios necesarios para poder compilar en Delphi 2007, 2009 y 2010.
Considero que para no crear confusion y dirigir a los futuros lectores a la solucion correcta seria bueno cerrar este hilo. Gracias por su ayuda y comprension.
Re: Codigo Fuente de Mdo Libre en Delphi distinto a version
Publicado: Mié Jul 07, 2010 8:31 pm
por vchavezp
Yo lo tengo trabajando en Delphi 2007 sin ningun problema
Re: Codigo Fuente de Mdo Libre en Delphi distinto a version
Publicado: Jue Jul 08, 2010 9:37 am
por Dado
Gracias por la informacion vchavezp
Tuviste que hacer alguna modificacion a las rutinas o asi como estaban compilo y funciono bien?
Re: Codigo Fuente de Mdo Libre en Delphi distinto a version
Publicado: Jue Jul 08, 2010 6:42 pm
por shang70
Si fueran tan amables de comentar si ya lo hicieron jalar en CODEGEAR 2009.
Saludos
Re: Codigo Fuente de Mdo Libre en Delphi distinto a version
Publicado: Vie Jul 09, 2010 8:28 pm
por vchavezp
En Delphi 2007 ha funcionado directamente sin ningun cambio
SI, LO TENGO!!! LO TENGO!!!!
Publicado: Sab Jul 10, 2010 1:58 pm
por Dado
La respuesta para DELPHI 2009 Y 2010 son cuatro letras -----a-n-s-i---- je je je, asi es, ayer me dormi hasta la una de la mañana y hoy he trabajado toda la mañana y parte de la tarde para llegar a este resultado.
En la unidad
Sello.pas se debe cambiar la definicion de la siguiente funcion:
function ReadPrivateKey(AFileName:
ansistring): pEVP_PKEY;
La explicacion rapidamente : Delphi 2009 en adelante (que por el momento "en adelante" solo es Delphi 2010) mapea el tipo "String" a "UnicodeString" que NO ES COMPATIBLE con el PChar que se le envia a las rutinas OpenSSL.
Quise explicar esto porque es muy probable QUE NO FUNCIONEN otras rutinas, podria apostar que la "Cadena Original" va a estar mal formada y que no se va a calcular bien el sello, pero como les platico no he dormido bien y ya no tengo energia para seguir ....
Bueno, revisen TODOS los procedimientos y cambien "String" por
"AnsiString", esta es la "norma" para un programa escrito en Delphi 7 y pasarlo a Delphi 2009/2010
Shang70, por favor, ya te pase el "tip" de donde empezar, podrias decirnos si esto funciono y mas aun, si hay necesidad de cambiar String por AnsiString en alguna otra parte?. Gracias.
Solo por hacer recuento, por eso SI funcionaba sin problemas en Delphi 2007, porque ahi todavia no introducian la (horrible) cadena Unicode.
Re: Codigo Fuente de Mdo Libre en Delphi distinto a version
Publicado: Mar Jul 13, 2010 1:20 pm
por omarloi
En CODEGEAR 2009 me corre sin problema, ya cambie en todas las rutinas String por ansistring, solo al dar CREAR EL CFD me marca el sig error:
Se encontro un caracter no valido en el contenido del texto. Line 2 <comprobante xmlns="http://www.sat.gob.m.
alguien sabe a que se deba ?
Re: Codigo Fuente de Mdo Libre en Delphi distinto a version
Publicado: Mar Jul 13, 2010 3:06 pm
por Dado
Pudieras ejecutarlo linea por linea y decirme exactamente en que linea te marca el error, ya que al darle clic en el boton CREAR CFD se desencadenan decenas de funciones, y es dificil con la informacion que me das poder detectar que es lo que esta fallando.
Re: Codigo Fuente de Mdo Libre en Delphi distinto a version
Publicado: Mar Jul 13, 2010 4:44 pm
por omarloi
Es en la CFDCopy := GetComprobante(XMLDocCopy) del FacturaE :
procedure TFacturaEForm.GeneraCadenaOriginal;
const pipe = '|';
var n,n1 : integer;
CFDCopy : IXMLComprobante; //Se requiere una copia ya que si se lee el original lo llena de "Null"
procedure AgregaDato(atom : ansistring);
begin
if atom <> '' then CadOriginal := CadOriginal + pipe + atom;
end;
begin
CadOriginal := pipe;
XMLDocCopy.XML := XMLDoc.XML;
XMLDocCopy.Active := true;
CFDCopy := GetComprobante(XMLDocCopy);
Gracias.
Re: Codigo Fuente de Mdo Libre en Delphi distinto a version
Publicado: Mar Jul 13, 2010 6:23 pm
por Dado
OMARLOI:
Vaya! por mas que trato de replicar el error no lo consigo.
Esto es lo que he hecho.
Descargue Delphi 2010, y el pasado sabado despues de la desvelada espantosa que me eche descubri que POR LO MENOS en el procedimiento ReadPrivateKey deberiamos usar AFileName : AnsiString
Despues de hacer *SOLO* este cambio lo ejecute y todo funciono casi perfecto, a partir de ahi yo pense que deberiamos cambiar todo a AnsiString, talvez esto es un error.
Bueno, hoy para tratar de replicar tu error empece a cambiar AniString por aqui y alla, y empece a tener varios problemas, pero no como el que me muestras.
Tambien descubri otro error pero ahora con el tipo char y en la funcion CalculaSello.
EN RESUMEN : : : :
Perdon, pero el haber recomendado cambiar *todo* a AnsiString parece que no era buena idea, no lo habia intentado yo mismo pero cuando lo quise hacer me empezo a dar algunas fallas. Hay que dejarlo como esta, solo con las dos siguientes excepciones:
Cambiar (ahora si, solo en esta funcion) :
Unidad Sello.pas
.....
function ReadPrivateKey(AFilename : AnsiString) : pEVP_PKEY;
....
....
function CalculaSello(llaveprivada,cadenaoriginal: string):string;
var inbuf array[0..8192] of ansichar;
outbuf array[0..8192] of ansichar;
Con *solo* esos cambios lo pude compilar y ejecutar perfectamente en Delphi 2010
NOTA: el cambio en la funcion CalculaSello es muuuuuy sutil, de hecho si no lo cambian aparentemente no hay problema PERO no calcula bien el sello
El sello correcto para los datos sin modificacion debe ser algo como "PTUpEgYNmX....etc"