Ver Mensaje Individual
  #9  
Antiguo 30-10-2020
nincillo nincillo is offline
Miembro
 
Registrado: may 2017
Posts: 151
Reputación: 7
nincillo Va por buen camino
Conseguir hacer funcionar la OperPinPad

Creo que necesito ayuda para saber como tratar la cadena que me devuelve dicha función en uno de sus parámetros.
La función devuelve un integer, y luego la "chicha" la devuelve en uno de los parámetros, que se supone que es una string con formato xml.

Yo hago la llamada a la función, y en el valor entero que me devuelve al función me viene un 0, con lo cual se supone que todo fue correcto, pero cuando intenten visualizar el contenido que ve viene en el parámetro string o añadirlo a las lineas de un memo, el programa se cierra de pronto sin llegar a sacar ningún mensaje de error.

Voy a poner el formato de llamada que viene en el manual y posteriormente los trozos de código de Delphi2007.

Cita:
Identificador Objeto: DllTpvpcLatente.TpvpImplantado

Para inicializar (que me funciona perfectamente):
int fnDllIniTpvpcLatente(LPCTSTR cComercio, LPCTSTR cTerminal, LPCTSTR cClaveFirma, LPCTSTR cConfPuerto, LPCTSTR cVersion)

Para mandar la petición de pago (que me funciona parcialmente, me aparece en el importe del pinpad el importe a cobrar y todo, pero que me rompe al intentar tratar el parámetro en el que me viene la información "importante" de la operación):
int fnDllOperPinPad(LPCTSTR cImporte, LPCTSTR cFactura, LPCTSTR cTipoOper, LPTSTR cXMLResp, int iTamMaxResp);
Un ejemplo que ponen en .NET
Cita:
[DllImport("dllTpvpcLatente.dll")]
public static extern int fnDllOperPinPad(String cImporte, String cFactura, String cTipoOper, StringBuilder cXMLResp, int iTamMaxResp);

/// <summary>
/// Función que confirma como se quiere realizar una operación que es DCC. Este método sólo debe
/// ser llamado después de fnDllOperPinPad.
/// </summary>
/// <param name="cImporte">Mismo valor que el que se utilizó en fnDllOperPinPad</param>
/// <param name="cFactura">Mismo valor que el que se utilizó en fnDllOperPinPad</param>
/// <param name="cTipoOper">Mismo valor que el que se utilizó en fnDllOperPinPad</param>
/// <param name="cCodDivisa">Código de divisa que debe seleccionar el Titular de la Tarjeta.</param>
/// <param name="cXMLResp">buffer que almacenará la cadena con el XML de respuesta recibido desde el TPV-PC. El XML se describe en detalle en el documento TPVPC WS Consultas 2d1.</param>
/// <param name="iTamMaxResp">tamaño máximo de la cadena que puede almacenar el buffer cXMLResp.</param>
/// <returns>valor = 0, la operación se proceso correctamente. Este resultado no indica que se ha autorizado o denegado, simplemente
/// que la petición se ha realizado con exito. Para ver el resultado de la operación se debe analizar la respuesta
/// recibida en cXMLResp.
///
Y como hago yo la definición en Delphi que seguro que algo estoy haciendo mal en la definición o en el tratamiento de la respuesta:
Cita:
implementation

{$R *.dfm}
// Método dinámico ->
type
TOperPinPad = function(cImporte, cFactura, cTipoOper :string; var cXmlResp :String; iTamMaxResp : integer) : integer;stdcall;

.....

procedure TForm1.BtnEnviarClick(Sender: TObject);
var
err : Integer;
OperPinPad : TOperPinPad;
cImporte, cFactura, cTipoOper:string;
cXmlResp: String;
iTamMaxResp:Integer;
begin
// if Conectado then
begin
{ Intento mandar la orden de pago }
@OperPinPad := GetProcAddress(dllHandleTpvPcLatente, PChar('fnDllOperPinPad'));
if @OperPinPad <> Nil then
begin
iTamMaxResp := 1024;
cImporte:= '0.01';
cFactura:='NF 2222';
cTipoOper:='PAGO';
cXmlResp:='';
err:=OperPinPad(cImporte, cFactura, cTipoOper, cXmlResp, iTamMaxResp);
Memo1.lines.add('Resultado: ' + IntToStr(err));
ShowMessage('Resultado: ' + IntToStr(err));
ShowMessage('cXmlResp: ' + cXmlResp);
Memo1.lines.add('cXmlResp: ' + cXmlResp) // --> Al principio, la llegar a esta línea, rompía. Ahora ya rompe al hacer el ShowMessage de un poco más arriba
end;
end
// else
// Memo1.lines.add('No hay conexión establecida...');
end;
Responder Con Cita