Gracias Antonio,
En este caso AnsiToWide() no funciona.
...... peeeeero, debemos estar muy cerca porque despues de algunos retoques, 'ret' ya devuelve los códigos correctos, y no hay errores.
El problema que falta por solucionar es que cuando 'ret' = 0, 'des' y 'paginahtml' deberian devolver la información correspondiente ... y SIEMPRE estan VACIOS.
La llamada a la funcion contenida en la DLL queda como sigue:
Code: Select all | Expand
local edi := StrTran(memoread("E:\edi.EXP"), hb_osnewline(), "")
local nif := "11112792C"
local des := space(Len(edi)*2+5000)
local paginahtml := space(25000)
private wadedinet := CreateObject( "Adedinet.OAdedinet" )
ret := wadedinet:Adedinet(nif, edi, @des, @paginahtml)
Adjunto el codigo fuente de la funcion a la que se llama dentro de la DLL por si alguien puede interpretarla y dar con la solución de como se le deben pasar los parámetros:
Code: Select all | Expand
// OAdedinet.cpp : Implementation of COAdedinet
#include "stdafx.h"
#include "Adedinet.h"
#include "OAdedinet.h"
#include "FirmaDigital.h"
#include "seleccion.h"
#include "conexion.h"
#include "respuesta.h"
#include "Edifact.h"
#include "Entorno.h"
#include "AceptCancel.h"
/////////////////////////////////////////////////////////////////////////////
// COAdedinet
STDMETHODIMP COAdedinet::Adedinet(BSTR Nif, BSTR Edi, BSTR Descripcion, BSTR PaginaHtml, long* retorno)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
USES_CONVERSION;
BSTR temp;
FirmaDigital F;
seleccion S;
conexion CI;
long ret; // DWORD
LPTSTR Datos_Envio;
PCCERT_CONTEXT pCertContextSelFirma;
PCCERT_CONTEXT pCertContextSelAutent;
CERT_CONTEXT CertContext;
LPTSTR Pagina_Respuesta;
respuesta R;
char buffer[13];
char resultado[14];
unsigned long pp;
Edifact E;
Entorno EN;
AceptCancel Dialogo;
char Descrip[500];
// pasar a ansi
Nif = (BSTR)W2A(Nif);
Edi = (BSTR)W2A(Edi);
put_descripcion( L"" );
put_paginahtml( L"" );
// Validar entorno
if ( ( ret = EN.Validar_Entorno()) != 0 )
{
R.Error_Descripcion(ret, Descrip);
temp = (BSTR)A2W( (char*) Descrip);
if ( Descripcion)
wcscpy(Descripcion,temp);
put_descripcion( temp );
*retorno= ret;
return S_OK;
}
// Validar fichero EDIFACT
if ( ( ret = E.Comprobar_Edifact(( char*)Edi)) != 0 )
{
R.Error_Descripcion(ret, Descrip);
temp = (BSTR)A2W( (char*) Descrip);
if ( Descripcion)
wcscpy(Descripcion,temp);
put_descripcion( temp );
*retorno= ret;
return S_OK;
}
// Certificados. Para firma y para autentificacion.
pCertContextSelFirma = S.FindCertContext((char*)Nif, (unsigned long*)&ret, MODO_FIRMA);
if (ret!=0) {
pCertContextSelFirma = S.FindCertContext2((char*)Nif, (unsigned long*)&ret);
}
pCertContextSelAutent = S.FindCertContext((char*)Nif, (unsigned long*)&ret, MODO_AUTENTICACION);
if ( ret == 0 )
{
// Reserva de memoria paea el envio
int lenvio = lstrlen((char*)Edi);
Datos_Envio = new char [lenvio*2+5000]; //[500000]
ret = F.Firma( (char*)Edi,pCertContextSelFirma, Datos_Envio);
if ( ret == 0 )
{
// Reserva de espacio para la recepcion
Pagina_Respuesta = new char [65000]; // [4016]
// ret = CI.ConexionInternet(CertContext,Datos_Envio, Pagina_Respuesta);
// Alerta del envio.
// Dialogo.m_texto = Datos_Envio;
// int RetModal;
// Dialogo.CenterWindow();
// RetModal = Dialogo.DoModal();
// if (RetModal == IDOK)
ret = CI.ConexionInternet(pCertContextSelAutent,Datos_Envio, Pagina_Respuesta);
// else
// ret = 2011; // Se cancelo el envio.
if ( ret == 0)
{
// Pagina HTML
temp = (BSTR)A2W( (char*) Pagina_Respuesta);
if ( PaginaHtml)
wcscpy(PaginaHtml,temp);
put_paginahtml( temp );
/* ********************* */
//MessageBox( NULL, (char*) Pagina_Respuesta, "ASCII", MB_OK );
//MessageBoxW( NULL, PaginaHtml, L"UNICODE", MB_OK );
//strcpy((char*) PaginaHtml,Pagina_Respuesta);
/* ********************* */
// Controlar los codigos devueltos
ret = R.Trata_Respuesta(Pagina_Respuesta);
if ( ret == 0 )
{ // respuesta
temp = (BSTR)A2W( (char*) Pagina_Respuesta);
if ( Descripcion)
wcscpy(Descripcion,temp);
put_descripcion( temp );
}
else if ( ret < 600001)
{
// Descripcion del error, bola 5 y 6
temp = (BSTR)A2W( (char*) Pagina_Respuesta);
if ( Descripcion)
wcscpy(Descripcion,temp);
put_descripcion( temp );
}
else
{
R.Error_Descripcion(ret, Descrip);
temp = (BSTR)A2W( (char*) Descrip);
if ( Descripcion )
wcscpy(Descripcion,temp);
put_descripcion( temp );
}
}
else
{
// Descripcion del error, fallo bola 5
R.Error_Descripcion(ret, Descrip);
temp = (BSTR)A2W( (char*) Descrip);
if ( Descripcion)
wcscpy(Descripcion,temp);
put_descripcion( temp );
ret = 500000 + ret;
}
delete Pagina_Respuesta;
}
else
{
// Descripcion de error, fallo bola 4
if (ret < 400041 || ret > 400045)
{
R.Error_Descripcion(ret, Descrip);
ret = 400000 + ret;
}
else
{
R.Error_Descripcion(ret, Descrip);
}
temp = (BSTR)A2W( (char*) Descrip);
if ( Descripcion)
wcscpy(Descripcion,temp);
put_descripcion( temp );
}
delete Datos_Envio;
*retorno= ret;
return S_OK;
}
else
{
//Descripcion de error, fallo en bola 3
if (ret < 300041 )
{
R.Error_Descripcion(ret, Descrip);
ret = 300000 + ret;
}
else
{
R.Error_Descripcion(ret, Descrip);
if ( ret > 300048 )
{
// Adecuar numero de error
strcpy(resultado,"3");
pp=ret;
_ultoa(pp,buffer,10);
strcat (resultado,buffer);
ret = atol(resultado);
}
}
temp = (BSTR)A2W( (char*) Descrip);
if ( Descripcion)
wcscpy(Descripcion,temp);
put_descripcion( temp );
*retorno= ret;
return S_OK;
}
return S_OK;
}
STDMETHODIMP COAdedinet::get_descripcion(BSTR *pVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
*pVal = ::SysAllocString( m_Descripcion );
return S_OK;
}
STDMETHODIMP COAdedinet::put_descripcion(BSTR newVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
if ( m_Descripcion )
{
::SysFreeString( m_Descripcion );
}
m_Descripcion = ::SysAllocString( newVal );
return S_OK;
}
STDMETHODIMP COAdedinet::get_paginahtml(BSTR *pVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
*pVal = ::SysAllocString( m_PaginaHtml );
return S_OK;
}
STDMETHODIMP COAdedinet::put_paginahtml(BSTR newVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
if ( m_PaginaHtml )
{
::SysFreeString( m_PaginaHtml );
}
m_PaginaHtml = ::SysAllocString( newVal );
return S_OK;
}
Ni que decir tiene que cuando no hay errores, 'ret' deberia devolver siempre '0' seguido de 'des' y 'paginahtml' con su información.
justo lo que hace ahora pero 'des' y 'paginahtml' vacios.
¡Que cerquita estamos!
