E-social Consulta

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

E-social Consulta

Mensagem por JoséQuintas »

Um chute.... a famosa situação de usarem API sem converter.

Isto é uma rotina antiga, talvez seja dos tempos de teste do Xharbour que precisei dela:

Código: Selecionar todos

      IF ValType( aRetorno ) == "C"
         cRetorno := aRetorno
      ELSE
         cRetorno := ""
         FOR EACH nAscii IN aRetorno
            cRetorno += Chr( nAscii )
         NEXT
      ENDIF
Uma rotina inversa:

Código: Selecionar todos

FUNCTION StringToByteArray( cTexto )

   LOCAL aResult := {}, oElement

   FOR EACH oElement IN cTexto
      AAdd( aResult, Asc( oElement ) )
   NEXT
   RETURN aResult
Ou se não puder usar assim, vai com nCont mesmo....

Código: Selecionar todos

FUNCTION StringToByteArray( cTexto )
   LOCAL aResult := {}, nCont, oElement
   FOR nCont = 1 TO Len( cTexto )
      oElement := Substr( cTexto, nCont, 1 )
      AAdd( aResult, Asc( oElement ) )
   NEXT
   RETURN aResult
Isso seria o tipo BYTE ARRAY, que existe em algumas APIs Windows: um array com o Ascii das letras.
Que seria mais fácil se a rotina intermediária em C já trabalhasse com o resultado convertido...

Então depois altere pra oComunicacao:Send( StringToByteArray( cTexto ) ) pra ver se resolve.

Talvez isso explique o uso do Dom:Document, só porque a rotina em C não foi padronizada.....

Diga depois se resolveu.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Eroni
Usuário Nível 1
Usuário Nível 1
Mensagens: 20
Registrado em: 18 Mai 2015 09:15
Localização: Criciuma/SC

E-social Consulta

Mensagem por Eroni »

Bom dia José, obrigado por responder, fiz alguns testes, todos sem sucesso ainda:

Usando assim:

Código: Selecionar todos

 oComunicacao:send( StringToByteArray( ::cXmlEnvelope ) 

STATIC FUNCTION StringToByteArray( cTexto )

 LOCAL aResult := {}, oElement

 FOR EACH oElement IN cTexto
   AAdd( aResult, Asc( oElement ) )
 NEXT
RETURN aResult
Resulta em neste erro:
Erro MSXML2.XMLHTTP/14 DISP_E_BADPARAMCOUNT: SEND
Código: 1001
Arg. 1 Tipo: A Valor: { ... }

Segui a sua idéia de usar o DOM:Document, pois uso na NFSe e NFe, assim:

Código: Selecionar todos

oDOMDoc := xhb_CreateObject( "MSXML2.DOMDocument.5.0" )
oDOMDoc:async              := .F.
oDOMDoc:resolveExternals   := .F.
oDOMDoc:validateOnParse    := .T.
oDOMDoc:preserveWhiteSpace := .T.
oDOMDoc:LoadXML( ::cXmlEnvelope )

oComunicacao:send( oDOMDoc:xml )

Porém desta vez não produziu erro, mas o valor de oComunicacao:responseText é nulo.

Qualquer força é bem vinda e agradecida.
Abraço.
xHarbour 1.2.1 FiveWin 1209 SQLRDD-SQLEX-xHarbour.org-March2010-build31
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

E-social Consulta

Mensagem por JoséQuintas »

Pois é... procurando na internet, todos os exemplos, de todas as linguagens de programação, passam string.
No Harbour também é assim.
Porque no xHarbour não aceita? .... mistério....
Só sobra ficar chutando, pra tentar descobrir que raios fizeram no Xharbour.

Veja se tem alguma coisa em ResponseBody ao invés de ResponseText.

E se funcionar, talvez interessante separar a rotina do DomDoc pra uma função de conversão.

Código: Selecionar todos

FUNCTION StringXmlHttp( cText )

   LOCAL oDomDoc := win_OleCreateObject( "MSXML.DomDocument.5.0" )

   oDomDoc:LoadXml( cText )
   
RETURN oDomDoc:Xml
Aliás... essa é outra diferença no xHarbour: precisa indicar a versão.

No Harbour, é automático, pega a que precisar.
Tem comunicação que usa MSXML3, MSXML4, MSXML5, MSXML6....
Vai ter que testar cada uma das versões, em cada comunicação, e também versão de DomDocument.

Lembrando que a versão 5 é a única que não vém instalada no Windows.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

E-social Consulta

Mensagem por JoséQuintas »

Na prática, isso já deveria ter sido perguntado há muito tempo no XHARBOUR.
Se o xHarbour precisa algo diferente de todas as outras linguagens de programação..... pra mim se trata de algum problema no xHarbour...

A propósito....
No Harbour tem:
d:\cdrom\FONTES\INTEGRA>hbmk2 -find createobject
xhb.hbc (installed):
CreateObject()
hbwin.hbc (installed):
win_oleCreateObject()
__oleCreateObject()
Tem até outro CreateObject na biblioteca de compatibilidade com Xharbour.
Tá entendendo porque a biblioteca de compatibilidade foi eliminada?
Segundo o Viktor, ela não foi atualizada para Windows moderno.
Estragar o Harbour pra ficar compatível com Xharbour não dá....
Quem sabe o mesmo não acontece com Xharbour e BCC.
Se for isso... tem jeito não... talvez só com mais rotinas em C, que é o que as LIBs costumam fazer.... rs
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Eroni
Usuário Nível 1
Usuário Nível 1
Mensagens: 20
Registrado em: 18 Mai 2015 09:15
Localização: Criciuma/SC

E-social Consulta

Mensagem por Eroni »

Bom dia José, agradeço pela sua atenção. Como já tenho estas mesmas rotinas rodando tanto pra gerir a NFe quanto NFSe, estou inclinado a acreditar ainda que deve ser algum problema relacionado a este webservice especifico do esocial, ou no xml, ou na url, estou descartando por enquanto algum problema com o xHarbour, pois os meus outros fontes estão funcionando.
Tentando buscar o resultado através de responseBody, dá o erro:
Código : 1001 Erro MSXML2.XMLHTTP/65535 E_UNEXPECTED: RESPONSEBODY
Chamada de Pilha
================
Chamado de TOLEAUTOX:RESPONSEBODY(0)
Chamado de ESOCIALCLASS:MICROSOFTXMLSOAPPOST(107)
Chamado de ESOCIALCLASS:CONSULTARETORNOLOTE(75)
Chamado de TESTEERONI(29)

Vou pesquisar mais para ver se descubro.
Abraço.
xHarbour 1.2.1 FiveWin 1209 SQLRDD-SQLEX-xHarbour.org-March2010-build31
Avatar do usuário
jairfab
Usuário Nível 3
Usuário Nível 3
Mensagens: 252
Registrado em: 21 Mai 2007 09:43
Localização: São Paulo, Região Leste - Suzano

E-social Consulta

Mensagem por jairfab »

Eu estou usando com xharbour e está funcionando, porem compilei junto w320le.prg
Delpji 7, harbour 3.2, xharbour 1.2.3, Bcc7, Minigw, Minigui 19.11, hwgui 2.20, FiveWin 19.05 Gtwvw, Gtwvg, C# VS 2017
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

E-social Consulta

Mensagem por JoséQuintas »

Justamente essa tinha na SefazClass.....
Nunca testei, porque se referia a xHarbour.
Acabou sendo eliminada, se não me engano, quando entrou a NFCe.
Talvez seja melhor ressucitá-la.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Eroni
Usuário Nível 1
Usuário Nível 1
Mensagens: 20
Registrado em: 18 Mai 2015 09:15
Localização: Criciuma/SC

E-social Consulta

Mensagem por Eroni »

Boa tarde, alguém que usa xHarbour poderia testar o código abaixo?
Grato.

Código: Selecionar todos

#include "hbclass.ch"

#ifndef XML_UTF8
 #define XML_UTF8          '<?xml version="1.0" encoding="UTF-8"?>'
#endif

FUNCTION Main()

 LOCAL cChave := "1.2.201709.0000000000000226099"
 LOCAL oESocial := ESocialClass():New()

 oESocial:cCertificado := "XXXX"

 oESocial:ConsultaRetornoLote( cChave )

 hb_MemoWrit( "retorno.xml", oEsocial:cXmlRetorno )

RETURN( NIL )

CREATE CLASS ESocialClass

 VAR  cCertificado INIT ""
 VAR  cUrl     INIT ""
 VAR  cSoapAction  INIT ""
 VAR  cXmlDocumento INIT ""
 VAR  cXmlEnvelope INIT ""
 VAR  cXmlRetorno  INIT ""
 METHOD ConsultaRetornoLote( cChave, cCertificado )
 METHOD MicrosoftXmlSoapPost()

ENDCLASS

METHOD ConsultaRetornoLote( cChave, cCertificado ) CLASS ESocialClass

 IF cCertificado != NIL
   ::cCertificado := cCertificado
 ENDIF
 ::cUrl     := "https://webservices.producaorestrita.esocial.gov.br/servicos/empregador/consultarloteeventos/WsConsultarLoteEventos.svc"
 ::cSOAPAction := "http://www.esocial.gov.br/servicos/empregador/lote/eventos/envio/consulta/retornoProcessamento/v1_1_0/ServicoConsultarLoteEventos/ConsultarLoteEventos"

 ::cXmlDocumento := ;
   '<eSocial xmlns="http://www.esocial.gov.br/schema/lote/eventos/envio/consulta/retornoProcessamento/v1_0_0">' + ;
   '<consultaLoteEventos>' + ;
       '<protocoloEnvio>' + cChave + '</protocoloEnvio>' + ;
    '</consultaLoteEventos>' + ;
   '</eSocial>'
 
 ::cXmlEnvelope := XML_UTF8 + ;
   '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" ' + ;
     'xmlns:v1="http://www.esocial.gov.br/servicos/empregador/lote/eventos/envio/consulta/retornoProcessamento/v1_1_0">' + ;
     '<soapenv:Header/>' + ;
     '<soapenv:Body>' + ;
    '<consultaLoteEventos>' + ;
     '<consulta>' + ;
      ::cXmlDocumento + ;
      '</consulta>' + ;
      '</consultaLoteEventos>' + ;
     '</soapenv:Body>' + ;
   '</soapenv:Envelope>'
   
 hb_MemoWrit( "consulta.xml", ::cXmlEnvelope )

 ::MicrosoftXmlSoapPost()

RETURN ::cXmlRetorno

METHOD MicrosoftXmlSoapPost() CLASS ESocialClass

 LOCAL oComunicacao

 oComunicacao = xHB_CreateObject( "MSXML2.XMLHTTP" )

//oComunicacao:setOption( 3, "CURRENT_USER\MY\" + ::cCertificado )
 oComunicacao:open( "POST", ::cUrl, .F. )
 oComunicacao:SetRequestHeader( "SOAPAction", ::cSOAPAction )
 oComunicacao:SetRequestHeader( "Content-Type", "text/xml; charset=utf-8" )

  oComunicacao:send( ::cXmlEnvelope  )

  DO WHILE oComunicacao:readyState <> 4
    Inkey(0.5)
  ENDDO

 ::cXmlRetorno := oComunicacao:responseText

RETURN NIL
xHarbour 1.2.1 FiveWin 1209 SQLRDD-SQLEX-xHarbour.org-March2010-build31
Avatar do usuário
jairfab
Usuário Nível 3
Usuário Nível 3
Mensagens: 252
Registrado em: 21 Mai 2007 09:43
Localização: São Paulo, Região Leste - Suzano

E-social Consulta

Mensagem por jairfab »

Este código seu não está funcionando não!
Delpji 7, harbour 3.2, xharbour 1.2.3, Bcc7, Minigw, Minigui 19.11, hwgui 2.20, FiveWin 19.05 Gtwvw, Gtwvg, C# VS 2017
Eroni
Usuário Nível 1
Usuário Nível 1
Mensagens: 20
Registrado em: 18 Mai 2015 09:15
Localização: Criciuma/SC

E-social Consulta

Mensagem por Eroni »

Não consegui descobrir onde está o erro ainda.
xHarbour 1.2.1 FiveWin 1209 SQLRDD-SQLEX-xHarbour.org-March2010-build31
Avatar do usuário
jairfab
Usuário Nível 3
Usuário Nível 3
Mensagens: 252
Registrado em: 21 Mai 2007 09:43
Localização: São Paulo, Região Leste - Suzano

E-social Consulta

Mensagem por jairfab »

Testa com este aqui funcionou 100%

Código: Selecionar todos

#include "fivewin.ch"
#include "hbclass.ch"
    
Static cUrl, cSoapAct, bOleInitialized:=.F., cCertCN

	 
#ifndef XML_UTF8
 #define XML_UTF8          '<?xml version="1.0" encoding="UTF-8"?>'
#endif
*----------------------------------------------------------------------------*
FUNCTION Main()
	 
LOCAL oSefaz := ESocialClass():New()
	 
WITH OBJECT oSefaz	 
   :cChave       := "1.2.201709.0000000000000236025"
   :cCertificado := "XXXX"
   :ConsultaRetornoLote( )
END WITH   

msgstop(oSefaz:cXmlRetorno ,"Retorno da consulta linha 93")

	 
hb_MemoWrit( "retorno.xml", oSefaz:cXmlRetorno )
	 
RETURN( NIL )
*----------------------------------------------------------------------------*
	



*----------------------------------------------------------------------------*
CREATE CLASS ESocialClass
 
	 VAR  cCertificado  INIT ""
	 VAR  cChave        INIT "1.2.201709.0000000000000236025" 
	 VAR  cUrl          INIT ""
	 VAR  cSoapAction   INIT ""
	 VAR  cXmlDocumento INIT ""
     VAR  cXmlEnvelope  INIT ""
	 VAR  cXmlRetorno   INIT ""
     
	 METHOD ConsultaRetornoLote( )
	 METHOD MicrosoftXmlSoapPost()
	 
ENDCLASS
*----------------------------------------------------------------------------*
	 

*----------------------------------------------------------------------------*
METHOD ConsultaRetornoLote(  ) CLASS ESocialClass
	 
	 
::cUrl        := "https://webservices.producaorestrita.esocial.gov.br/servicos/empregador/consultarloteeventos/WsConsultarLoteEventos.svc"
::cSOAPAction := "http://www.esocial.gov.br/servicos/empregador/lote/eventos/envio/consulta/retornoProcessamento/v1_1_0/ServicoConsultarLoteEventos/ConsultarLoteEventos"

::cXmlDocumento := '<eSocial xmlns="http://www.esocial.gov.br/schema/lote/eventos/envio/consulta/retornoProcessamento/v1_0_0">' + ;
  '<consultaLoteEventos>' + ;
      '<protocoloEnvio>' + ::cChave + '</protocoloEnvio>' + ;
   '</consultaLoteEventos>' + ;
  '</eSocial>'
 
::cXmlEnvelope := XML_UTF8 + ;
  '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" ' + ;
    'xmlns:v1="http://www.esocial.gov.br/servicos/empregador/lote/eventos/envio/consulta/retornoProcessamento/v1_1_0">' + ;
    '<soapenv:Header/>' + ;
    '<soapenv:Body>' + ;
   '<consultaLoteEventos>' + ;
    '<consulta>' + ;
     ::cXmlDocumento + ;
     '</consulta>' + ;
     '</consultaLoteEventos>' + ;
    '</soapenv:Body>' + ;
  '</soapenv:Envelope>'
   
hb_MemoWrit( "consulta.xml", ::cXmlEnvelope )

::MicrosoftXmlSoapPost()
	 

RETURN ::cXmlRetorno
*----------------------------------------------------------------------------*
	 
	

*----------------------------------------------------------------------------*
METHOD MicrosoftXmlSoapPost() CLASS ESocialClass
	 
LOCAL oComunicacao

oComunicacao:= xHB_CreateObject( "MSXML2.XMLHTTP" )
oComunicacao:open( "POST", ::cUrl, .F. )
oComunicacao:SetRequestHeader( "SOAPAction", ::cSOAPAction )
oComunicacao:SetRequestHeader( "Content-Type", "text/xml; charset=utf-8" )

oComunicacao:send( ::cXmlEnvelope  )

DO WHILE oComunicacao:readyState <> 4
  Inkey(0.5)
ENDDO

::cXmlRetorno := oComunicacao:responseText

	 
RETURN NIL
*----------------------------------------------------------------------------*




#ifndef __PLATFORM__Windows

#include "common.ch"

  Function xhb_CreateObject()
  Return NIL

  FUNCTION xhb_GetActiveObject( cString )
    HB_SYMBOL_UNUSED( cString )
  Return NIL

#else

#include "hbclass.ch"
#include "error.ch"
#include "vt.ch"
#include "oleerr.ch"

//----------------------------------------------------------------------------//
FUNCTION xhb_CreateObject( cString, cLicense )
//----------------------------------------------------------------------------//

RETURN TOleAutoX():New( cString, , cLicense )

//----------------------------------------------------------------------------//
FUNCTION xhb_GetActiveObject( cString )
//----------------------------------------------------------------------------//

RETURN TOleAutoX():GetActiveObject( cString )

//----------------------------------------------------------------------------//
CLASS TOleAutoX

   DATA hObj
   DATA cClassName

   METHOD New( uObj, cClass ) CONSTRUCTOR
   METHOD GetActiveObject( cClass ) CONSTRUCTOR

   METHOD Invoke()
   MESSAGE Set METHOD Invoke()
   MESSAGE Get METHOD Invoke()

   METHOD Collection( xIndex, xValue ) OPERATOR "[]"

   // Needed to refernce, or hb_dynsymFindName() will fail
   METHOD ForceSymbols() INLINE ::cClassName()

   ERROR HANDLER OnError()

   DESTRUCTOR Release()

ENDCLASS

//--------------------------------------------------------------------

METHOD New( uObj, cClass ) CLASS TOleAutoX

   LOCAL oErr

   // Hack incase OLE Server already created and New() is attempted as an OLE Method.

   IF ::hObj != NIL
      RETURN HB_ExecFromArray( Self, "_New", HB_aParams() )
   ENDIF

   IF ValType( uObj ) = 'C'

      ::hObj := CreateOleObject( uObj )

      IF WOleError() != 0

         IF WOle2TxtError() == "DISP_E_EXCEPTION"

            oErr := ErrorNew()

            oErr:Args          := HB_aParams()
            oErr:CanDefault    := .F.
            oErr:CanRetry      := .F.
            oErr:CanSubstitute := .T.
            oErr:Description   := OLEExceptionDescription()
            oErr:GenCode       := EG_OLEEXECPTION

            oErr:Operation     := ProcName()
            oErr:Severity      := ES_ERROR

            oErr:SubCode       := -1
            oErr:SubSystem     := OLEExceptionSource()

            RETURN Eval( ErrorBlock(), oErr )
         ELSE
            oErr := ErrorNew()
            oErr:Args          := HB_aParams()
            oErr:CanDefault    := .F.
            oErr:CanRetry      := .F.
            oErr:CanSubstitute := .T.
            oErr:Description   := WOle2TxtError()
            oErr:GenCode       := EG_OLEEXECPTION
            oErr:Operation     := ProcName()
            oErr:Severity      := ES_ERROR
            oErr:SubCode       := -1
            oErr:SubSystem     := "TOleAutoX"

            RETURN Eval( ErrorBlock(), oErr )
         ENDIF
      ENDIF

      ::cClassName := uObj
   ELSEIF ValType( uObj ) = 'N'
      ::hObj := uObj

      IF ValType( cClass ) == 'C'
         ::cClassName := cClass
      ELSE
         ::cClassName := LTrim( Str( uObj ) )
      ENDIF
   ELSE
      MessageBox( 0, "Invalid parameter type to constructor TOleAutoX():New()!", "OLE Interface", 0 )
      ::hObj := 0
   ENDIF

RETURN Self

//--------------------------------------------------------------------

// Destructor!
PROCEDURE Release() CLASS TOleAutoX

   IF ! Empty( ::hObj )
       OleReleaseObject( ::hObj )
   ENDIF

RETURN

//--------------------------------------------------------------------
METHOD GetActiveObject( cClass ) CLASS TOleAutoX
//--------------------------------------------------------------------

   LOCAL oErr

   IF ValType( cClass ) = 'C'

      ::hObj := GetOleObject( cClass )

      IF WOleError() != 0

         IF WOle2TxtError() == "DISP_E_EXCEPTION"
            oErr := ErrorNew()
            oErr:Args          := { cClass }
            oErr:CanDefault    := .F.
            oErr:CanRetry      := .F.
            oErr:CanSubstitute := .T.
            oErr:Description   := OLEExceptionDescription()
            oErr:GenCode       := EG_OLEEXECPTION
            oErr:Operation     := ProcName()
            oErr:Severity      := ES_ERROR
            oErr:SubCode       := -1
            oErr:SubSystem     := OLEExceptionSource()

            RETURN Eval( ErrorBlock(), oErr )
         ELSE
            oErr := ErrorNew()
            oErr:Args          := { cClass }
            oErr:CanDefault    := .F.
            oErr:CanRetry      := .F.
            oErr:CanSubstitute := .T.
            oErr:Description   := WOle2TxtError()
            oErr:GenCode       := EG_OLEEXECPTION
            oErr:Operation     := ProcName()
            oErr:Severity      := ES_ERROR
            oErr:SubCode       := -1
            oErr:SubSystem     := "TOleAutoX"

            RETURN Eval( ErrorBlock(), oErr )
         ENDIF
      ENDIF

      ::cClassName := cClass
   ELSE
      MessageBox( 0, "Invalid parameter type to constructor TOleAutoX():GetActiveObject()!", "OLE Interface", 0 )
      ::hObj := 0
   ENDIF

RETURN Self

//--------------------------------------------------------------------
METHOD Invoke( ... ) CLASS TOleAutoX
//--------------------------------------------------------------------
   LOCAL cMethod := HB_aParams()[1]

RETURN HB_ExecFromArray( Self, cMethod, aDel( HB_aParams(), 1, .T. ) )

//--------------------------------------------------------------------
METHOD Collection( xIndex, xValue ) CLASS TOleAutoX
//--------------------------------------------------------------------
   LOCAL xRet

   IF PCount() == 1
      RETURN ::Item( xIndex )
   ENDIF

   TRY
      // ASP Collection syntax.
      xRet := ::_Item( xIndex, xValue )
   CATCH
      xRet := ::SetItem( xIndex, xValue )
   END

RETURN xRet

#pragma BEGINDUMP

   #ifndef CINTERFACE
      #define CINTERFACE 1
   #endif

   #define NONAMELESSUNION

   #include "hbapiitm.h"
   #include "hbapierr.h"
   #include "hbvm.h"
   #include "hbdate.h"
   #include "hbfast.h"
#include "hbapi.h"
#include "hbstack.h"

#include <ctype.h>
   #include <windows.h>
   #include <ole2.h>
   #include <oleauto.h>

   #ifdef __MINGW32__
      // Missing in oleauto.h
      WINOLEAUTAPI VarR8FromDec(DECIMAL *pdecIn, DOUBLE *pdblOut);
   #endif

   #if ( defined(__DMC__) || defined(__MINGW32__) || ( defined(__WATCOMC__) && !defined(__FORCE_LONG_LONG__) ) )
      #define HB_LONG_LONG_OFF
   #endif

   static HRESULT  s_nOleError;
   static HB_ITEM  OleAuto;

   static PHB_DYNS s_pSym_OleAuto;
   static PHB_DYNS s_pSym_hObj;
   static PHB_DYNS s_pSym_New;
   static PHB_DYNS s_pSym_cClassName;

   static BOOL *s_OleRefFlags = NULL;

   static VARIANTARG RetVal;

  static EXCEPINFO excep;

  static PHB_ITEM *aPrgParams = NULL;

  static BSTR bstrMessage;
  static DISPID lPropPut = DISPID_PROPERTYPUT;
  static UINT uArgErr;


   HB_FUNC_STATIC( OLE_INITIALIZE )
   {
      s_nOleError = OleInitialize( NULL );

      s_pSym_OleAuto = hb_dynsymFindName( "TOLEAUTOX" );
      s_pSym_New  = hb_dynsymFindName( "NEW" );
      s_pSym_hObj        = hb_dynsymFindName( "HOBJ" );
      s_pSym_cClassName  = hb_dynsymFindName( "CCLASSNAME" );

   }

   HB_FUNC_STATIC( OLE_UNINITIALIZE )
   {
      OleUninitialize();
   }
  //---------------------------------------------------------------------------//

  static double DateToDbl( LPSTR cDate )
  {
     double nDate;

     nDate = hb_dateEncStr( cDate ) - 0x0024d9abL;

     return ( nDate );
  }

  //---------------------------------------------------------------------------//

  static LPSTR DblToDate( double nDate )
  {
     static char cDate[9] = "00000000";

     hb_dateDecStr( cDate, (LONG) nDate + 0x0024d9abL );

     return ( cDate );
  }

  //---------------------------------------------------------------------------//


  static BSTR AnsiToSysString( LPSTR cString )
  {
     BSTR bstrString;
     int nConvertedLen = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, cString, -1, NULL, 0 ) -1;

     bstrString = SysAllocStringLen( NULL, nConvertedLen );

     if( bstrString )
     {
        bstrString[0] = '\0';
        MultiByteToWideChar( CP_ACP, 0, cString, -1,  bstrString, nConvertedLen );
     }

     return bstrString;
  }

  //---------------------------------------------------------------------------//

  static LPSTR WideToAnsi( BSTR wString )
  {
     char *cString;
     int nConvertedLen = WideCharToMultiByte( CP_ACP, 0, wString, -1, NULL, 0, NULL, NULL );

     if( nConvertedLen )
     {
        cString = (char *) hb_xgrab( nConvertedLen );
        WideCharToMultiByte( CP_ACP, 0, wString, -1, cString, nConvertedLen, NULL, NULL );
     }
     else
     {
        cString = (char *) hb_xgrab( 1 );
        cString[0] = '\0';
     }

     //wprintf( L"\nWide: '%s'\n", wString );
     //printf( "\nAnsi: '%s'\n", cString );

     return cString;
  }

  //---------------------------------------------------------------------------//

  static void GetParams( DISPPARAMS *pDispParams )
  {
     VARIANTARG * pArgs = NULL;
     PHB_ITEM uParam;
     int n, nArgs, nArg;
     BOOL bByRef;

     nArgs = hb_pcount();

     if( nArgs > 0 )
     {
        pArgs = ( VARIANTARG * ) hb_xgrab( sizeof( VARIANTARG ) * nArgs );
        aPrgParams = ( PHB_ITEM * ) hb_xgrab( sizeof( PHB_ITEM ) * nArgs );

        // 1 Based!!!
        s_OleRefFlags = (BOOL *) hb_xgrab( ( nArgs + 1 ) * sizeof( BOOL ) );

        //printf( "Args: %i\n", nArgs );

        for( n = 0; n < nArgs; n++ )
        {
           // Parameters are processed in reversed order.
           nArg = nArgs - n;

           VariantInit( &( pArgs[ n ] ) );

           uParam = hb_param( nArg, HB_IT_ANY );

           bByRef = HB_IS_BYREF( hb_stackItemFromBase( nArg ) );

           // 1 Based!!!
           s_OleRefFlags[ nArg ] = bByRef;

           //TraceLog( NULL, "N: %i Arg: %i Type: %i %i ByRef: %i\n", n, nArg, hb_stackItemFromBase( nArg  )->type, uParam->type, bByRef );

           aPrgParams[ n ] = uParam;

           switch( uParam->type )
           {
              case HB_IT_NIL:
                pArgs[ n ].n1.n2.vt   = VT_EMPTY;
                break;

              case HB_IT_STRING:
              case HB_IT_MEMO:
                if( bByRef )
                {
                   hb_itemPutCRawStatic( uParam, ( char *) AnsiToSysString( hb_parcx( nArg ) ), uParam->item.asString.length * 2 + 1 );

                   pArgs[ n ].n1.n2.vt   = VT_BYREF | VT_BSTR;
                   pArgs[ n ].n1.n2.n3.pbstrVal = (BSTR *) &( uParam->item.asString.value );
                   //wprintf( L"*** BYREF >%s<\n", *pArgs[ n ].n1.n2.n3.bstrVal );
                }
                else
                {
                   pArgs[ n ].n1.n2.vt   = VT_BSTR;
                   pArgs[ n ].n1.n2.n3.bstrVal = AnsiToSysString( hb_parcx( nArg ) );
                   //wprintf( L"*** >%s<\n", pArgs[ n ].n1.n2.n3.bstrVal );
                }
                break;

              case HB_IT_LOGICAL:
                if( bByRef )
                {
                   pArgs[ n ].n1.n2.vt = VT_BYREF | VT_BOOL;
                   pArgs[ n ].n1.n2.n3.pboolVal = (short *) &( uParam->item.asLogical.value ) ;
                   uParam->type = HB_IT_LONG;
                }
                else
                {
                   pArgs[ n ].n1.n2.vt = VT_BOOL;
                   pArgs[ n ].n1.n2.n3.boolVal = hb_parl( nArg ) ? VARIANT_TRUE : VARIANT_FALSE;
                }
                break;

              case HB_IT_INTEGER:
#if HB_INT_MAX == INT16_MAX
                if( bByRef )
                {
                   pArgs[ n ].n1.n2.vt = VT_BYREF | VT_I2;
                   pArgs[ n ].n1.n2.n3.piVal = &( uParam->item.asInteger.value ) ;
                }
                else
                {
                   pArgs[ n ].n1.n2.vt = VT_I2;
                   pArgs[ n ].n1.n2.n3.iVal = hb_parni( nArg );
                }
                break;
#else
                if( bByRef )
                {
                   pArgs[ n ].n1.n2.vt = VT_BYREF | VT_I4;
                   pArgs[ n ].n1.n2.n3.plVal = (long *) &( uParam->item.asInteger.value ) ;
                }
                else
                {
                   pArgs[ n ].n1.n2.vt = VT_I4;
                   pArgs[ n ].n1.n2.n3.lVal = hb_parnl( nArg );
                }
                break;
#endif
              case HB_IT_LONG:
#if HB_LONG_MAX == INT32_MAX || defined( HB_LONG_LONG_OFF )
                if( bByRef )
                {
                   pArgs[ n ].n1.n2.vt = VT_BYREF | VT_I4;
                   pArgs[ n ].n1.n2.n3.plVal = (long *) &( uParam->item.asLong.value ) ;
                }
                else
                {
                   pArgs[ n ].n1.n2.vt = VT_I4;
                   pArgs[ n ].n1.n2.n3.lVal = hb_parnl( nArg );
                }
#else
                if( bByRef )
                {
                   pArgs[ n ].n1.n2.vt = VT_BYREF | VT_I8;
                   pArgs[ n ].n1.n2.n3.pllVal = &( uParam->item.asLong.value ) ;
                }
                else
                {
                   pArgs[ n ].n1.n2.vt = VT_I8;
                   pArgs[ n ].n1.n2.n3.llVal = hb_parnll( nArg );
                }
#endif
                break;

              case HB_IT_DOUBLE:
                if( bByRef )
                {
                   pArgs[ n ].n1.n2.vt = VT_BYREF | VT_R8;
                   pArgs[ n ].n1.n2.n3.pdblVal = &( uParam->item.asDouble.value ) ;
                   uParam->type = HB_IT_DOUBLE;
                }
                else
                {
                   pArgs[ n ].n1.n2.vt   = VT_R8;
                   pArgs[ n ].n1.n2.n3.dblVal = hb_parnd( nArg );
                }
                break;

              case HB_IT_DATE:
                if( bByRef )
                {
                   pArgs[ n ].n1.n2.vt = VT_BYREF | VT_DATE;
                   uParam->item.asDouble.value = DateToDbl( hb_pards( nArg ) );
                   pArgs[ n ].n1.n2.n3.pdblVal = &( uParam->item.asDouble.value ) ;
                   uParam->type = HB_IT_DOUBLE;
                }
                else
                {
                   pArgs[ n ].n1.n2.vt   = VT_DATE;
                   pArgs[ n ].n1.n2.n3.dblVal = DateToDbl( hb_pards( nArg ) );
                }
                break;

              case HB_IT_ARRAY:
              {
                 pArgs[ n ].n1.n2.vt = VT_EMPTY;

                 if( ! HB_IS_OBJECT( uParam ) )
                 {
                    SAFEARRAYBOUND rgsabound;
                    PHB_ITEM       elem;
                    long           count;
                    long           i;

                    count = hb_arrayLen( uParam );

                    rgsabound.cElements = count;
                    rgsabound.lLbound = 0;
                    pArgs[ n ].n1.n2.vt        = VT_ARRAY | VT_VARIANT;
                    pArgs[ n ].n1.n2.n3.parray = SafeArrayCreate( VT_VARIANT, 1, &rgsabound );

                    for( i = 0; i < count; i++ )
                    {
                       elem = hb_arrayGetItemPtr( uParam, i+1 );

                       if( strcmp( hb_objGetClsName( elem ), "TOLEAUTOX" ) == 0 )
                       {
                          VARIANT mVariant;

                          VariantInit( &mVariant );

                          hb_vmPushSymbol( s_pSym_hObj->pSymbol );
                          hb_vmPush( elem );
                          hb_vmSend( 0 );

                          mVariant.n1.n2.vt = VT_DISPATCH;
                          mVariant.n1.n2.n3.pdispVal = ( IDispatch * ) hb_parnl( -1 );
                          SafeArrayPutElement( pArgs[ n ].n1.n2.n3.parray, &i, &mVariant );
                       }
                    }
                 }
                 else
                 {
                    if( hb_clsIsParent( uParam->item.asArray.value->uiClass , "TOLEAUTOX" ) )
                    {
                       hb_vmPushSymbol( s_pSym_hObj->pSymbol );
                       hb_vmPush( uParam );
                       hb_vmSend( 0 );
                       //TraceLog( NULL, "\n#%i Dispatch: %ld\n", n, hb_parnl( -1 ) );
                       pArgs[ n ].n1.n2.vt = VT_DISPATCH;
                       pArgs[ n ].n1.n2.n3.pdispVal = ( IDispatch * ) hb_parnl( -1 );
                       //printf( "\nDispatch: %p\n", pArgs[ n ].n1.n2.n3.pdispVal );

                    }
                    else
                    {
                       TraceLog( NULL, "Class: '%s' not suported!\n", hb_objGetClsName( uParam ) );
                    }
                 }
              }
              break;
           }
        }
     }

     pDispParams->rgvarg            = pArgs;
     pDispParams->cArgs             = nArgs;
     pDispParams->rgdispidNamedArgs = 0;
     pDispParams->cNamedArgs        = 0;
  }

  //---------------------------------------------------------------------------//

  static void FreeParams( DISPPARAMS *pDispParams )
  {
     int n, nParam;
     char *sString;

     if( pDispParams->cArgs > 0 )
     {
        for( n = 0; n < ( int ) pDispParams->cArgs; n++ )
        {
           nParam = pDispParams->cArgs - n;

           //TraceLog( NULL, "*** N: %i, Param: %i Type: %i\n", n, nParam, pDispParams->rgvarg[ n ].n1.n2.vt );

           // 1 Based!!!
           if( s_OleRefFlags[ nParam ]  )
           {
              switch( pDispParams->rgvarg[ n ].n1.n2.vt )
              {
                 case VT_BYREF | VT_BSTR:
                   //printf( "String\n" );
                   sString = WideToAnsi( *( pDispParams->rgvarg[ n ].n1.n2.n3.pbstrVal ) );

                   SysFreeString( *( pDispParams->rgvarg[ n ].n1.n2.n3.pbstrVal ) );

                   hb_itemPutCPtr( aPrgParams[ n ], sString, strlen( sString ) );
                   break;

                 // Already using the PHB_ITEM allocated value
                 /*
                 case VT_BYREF | VT_BOOL:
                   //printf( "Logical\n" );
                   ( aPrgParams[ n ] )->type = HB_IT_LOGICAL;
                   ( aPrgParams[ n ] )->item.asLogical.value = pDispParams->rgvarg[ n ].n1.n2.n3.boolVal ;
                   break;
                 */

                 case VT_DISPATCH:
                 case VT_BYREF | VT_DISPATCH:
                   //TraceLog( NULL, "Dispatch %p\n", pDispParams->rgvarg[ n ].n1.n2.n3.pdispVal );
                   if( pDispParams->rgvarg[ n ].n1.n2.n3.pdispVal == NULL )
                   {
                      hb_itemClear( aPrgParams[ n ] );
                      break;
                   }

                   OleAuto.type = HB_IT_NIL;

                   if( s_pSym_OleAuto )
                   {
                      hb_vmPushSymbol( s_pSym_OleAuto->pSymbol );
                      hb_vmPushNil();
                      hb_vmDo( 0 );

                      hb_itemForwardValue( &OleAuto, hb_stackReturnItem()) ;
                   }

                   if( s_pSym_New && OleAuto.type )
                   {

                      hb_vmPushSymbol( s_pSym_New->pSymbol );
                      hb_itemPushForward( &OleAuto );
                      hb_vmPushLong( ( LONG ) pDispParams->rgvarg[ n ].n1.n2.n3.pdispVal );
                      hb_vmSend( 1 );

                      hb_itemForwardValue( aPrgParams[ n ], hb_stackReturnItem() );
                   }
                   // Can't CLEAR this Variant
                   continue;

                 /*
                 case VT_BYREF | VT_I2:
                   //printf( "Int %i\n", pDispParams->rgvarg[ n ].n1.n2.n3.iVal );
                   hb_itemPutNI( aPrgParams[ n ], ( int ) pDispParams->rgvarg[ n ].n1.n2.n3.iVal );
                   break;

                 case VT_BYREF | VT_I4:
                   //printf( "Long %ld\n", pDispParams->rgvarg[ n ].n1.n2.n3.lVal );
                   hb_itemPutNL( aPrgParams[ n ], ( LONG ) pDispParams->rgvarg[ n ].n1.n2.n3.lVal );
                   break;

#ifndef HB_LONG_LONG_OFF
                 case VT_BYREF | VT_I8:
                   //printf( "Long %Ld\n", pDispParams->rgvarg[ n ].n1.n2.n3.llVal );
                   hb_itemPutNLL( aPrgParams[ n ], ( LONGLONG ) pDispParams->rgvarg[ n ].n1.n2.n3.llVal );
                   break;
#endif

                 case VT_BYREF | VT_R8:
                   //printf( "Double\n" );
                   hb_itemPutND( aPrgParams[ n ],  pDispParams->rgvarg[ n ].n1.n2.n3.dblVal );
                   break;
                 */

                 case VT_BYREF | VT_DATE:
                   //printf( "Date\n" );
                   hb_itemPutDS( aPrgParams[ n ], DblToDate( *( pDispParams->rgvarg[ n ].n1.n2.n3.pdblVal ) ) );
                   break;

                 /*
                 case VT_BYREF | VT_EMPTY:
                   //printf( "Nil\n" );
                   hb_itemClear( aPrgParams[ n ] );
                   break;
                 */

                 default:
                   TraceLog( NULL, "*** Unexpected Type: %i***\n", pDispParams->rgvarg[ n ].n1.n2.vt );
              }
           }
           else
           {
              switch( pDispParams->rgvarg[ n ].n1.n2.vt )
              {
                 case VT_BSTR:
                   break;

                 case VT_DISPATCH:
                   //TraceLog( NULL, "***NOT REF*** Dispatch %p\n", pDispParams->rgvarg[ n ].n1.n2.n3.pdispVal );
                   // Can'r CLEAR this Variant.
                   continue;

                 //case VT_ARRAY | VT_VARIANT:
                 //  SafeArrayDestroy( pDispParams->rgvarg[ n ].n1.n2.n3.parray );
              }
           }

           VariantClear( &(pDispParams->rgvarg[ n ] ) );
        }

        hb_xfree( ( LPVOID ) pDispParams->rgvarg );

        hb_xfree( (void *) s_OleRefFlags );
        s_OleRefFlags = NULL;

        hb_xfree( ( LPVOID ) aPrgParams );
        aPrgParams = NULL;
     }
  }

  //---------------------------------------------------------------------------//

  static void RetValue( void )
  {
     LPSTR cString;

     /*
     printf( "Type: %i\n", RetVal.n1.n2.vt );
     fflush( stdout );
     getchar();
     */

     switch( RetVal.n1.n2.vt )
     {
        case VT_BSTR:
          //printf( "String\n" );
          cString = WideToAnsi( RetVal.n1.n2.n3.bstrVal );
          //printf( "cString %s\n", cString );
          hb_retcAdopt( cString );
          //printf( "Adopted\n" );
          break;

        case VT_BOOL:
          hb_retl( RetVal.n1.n2.n3.boolVal == VARIANT_TRUE ? 1 :0 );
          break;

        case VT_DISPATCH:
          if( RetVal.n1.n2.n3.pdispVal == NULL )
          {
             hb_ret();
             break;
          }

          OleAuto.type = HB_IT_NIL;

          if( s_pSym_OleAuto )
          {
             hb_vmPushSymbol( s_pSym_OleAuto->pSymbol );
             hb_vmPushNil();
             hb_vmDo( 0 );

             hb_itemForwardValue( &OleAuto, hb_stackReturnItem() ) ; //; &(HB_VM_STACK.Return) );
          }

          if( s_pSym_New && OleAuto.type )
          {
             //TOleAuto():New( nDispatch )
             hb_vmPushSymbol( s_pSym_New->pSymbol );
             hb_itemPushForward( &OleAuto );
             hb_vmPushLong( ( LONG ) RetVal.n1.n2.n3.pdispVal );
             hb_vmSend( 1 );
             //printf( "Dispatch: %ld %ld\n", ( LONG ) RetVal.n1.n2.n3.pdispVal, (LONG) hb_stack.Return.item.asArray.value );
          }
          break;

        case VT_I1:     // Byte
        case VT_UI1:
          hb_retni( ( short ) RetVal.n1.n2.n3.bVal );
          break;

        case VT_I2:     // Short (2 bytes)
        case VT_UI2:
          hb_retni( ( short ) RetVal.n1.n2.n3.iVal );
          break;

        case VT_I4:     // Long (4 bytes)
        case VT_UI4:
        case VT_INT:
        case VT_UINT:
          hb_retnl( ( LONG ) RetVal.n1.n2.n3.lVal );
          break;

#ifndef HB_LONG_LONG_OFF
        case VT_I8:     // LongLong (8 bytes)
        case VT_UI8:
          hb_retnll( ( LONGLONG ) RetVal.n1.n2.n3.llVal );
          break;
#endif

        case VT_R4:     // Single
          hb_retnd( RetVal.n1.n2.n3.fltVal );
          break;

        case VT_R8:     // Double
          hb_retnd( RetVal.n1.n2.n3.dblVal );
          break;

        case VT_CY:     // Currency
        {
          double tmp = 0;
          VarR8FromCy( RetVal.n1.n2.n3.cyVal, &tmp );
          hb_retnd( tmp );
        }
          break;

        case VT_DECIMAL: // Decimal
          {
          double tmp = 0;
          VarR8FromDec( &RetVal.n1.decVal, &tmp );
          hb_retnd( tmp );
          }
          break;

        case VT_DATE:
          hb_retds( DblToDate( RetVal.n1.n2.n3.dblVal ) );
          break;

        case VT_EMPTY:
        case VT_NULL:
          hb_ret();
          break;

        case VT_ARRAY | VT_VARIANT:
        {
           long     i, nFrom, nTo;
           VARIANT  mElem;
           HB_ITEM Result, Add;

           SafeArrayGetLBound( RetVal.n1.n2.n3.parray, 1, &nFrom );
           SafeArrayGetUBound( RetVal.n1.n2.n3.parray, 1, &nTo );

           Result.type = HB_IT_NIL;
           hb_arrayNew( &Result, 0 );

           Add.type = HB_IT_NIL;

           for ( i = nFrom; i <= nTo; i++ )
           {
              VariantInit( &mElem );
              SafeArrayGetElement( RetVal.n1.n2.n3.parray, &i, &mElem );

              if( mElem.n1.n2.vt == VT_DISPATCH && mElem.n1.n2.n3.pdispVal )
              {
                 if( s_pSym_OleAuto )
                 {
                    hb_vmPushSymbol( s_pSym_OleAuto->pSymbol );
                    hb_vmPushNil();
                    hb_vmDo( 0 );

                    hb_itemForwardValue( &Add, hb_stackReturnItem() );
                 }

                 if( s_pSym_New && Add.type )
                 {
                    hb_vmPushSymbol( s_pSym_New->pSymbol );
                    hb_vmPush( &Add );
                    hb_vmPushLong( ( LONG ) mElem.n1.n2.n3.pdispVal );
                    hb_vmSend( 1 );

                    mElem.n1.n2.n3.pdispVal->lpVtbl->AddRef( mElem.n1.n2.n3.pdispVal );
                 }

                 hb_arrayAddForward( &Result, &Add );
              }

              VariantClear( &mElem );
           }

           hb_itemReturn( &Result );
        }
        break;
/*- end ----------------------------->8-------------------------------------*/

        default:
          //printf( "Default %i!\n", RetVal.n1.n2.vt );
          if( s_nOleError == S_OK )
          {
             s_nOleError = E_UNEXPECTED;
          }

          hb_ret();
          break;
     }

     if( RetVal.n1.n2.vt == VT_DISPATCH && RetVal.n1.n2.n3.pdispVal )
     {
        //printf( "Dispatch: %ld\n", ( LONG ) RetVal.n1.n2.n3.pdispVal );
     }
     else
     {
        VariantClear( &RetVal );
     }
  }

  //---------------------------------------------------------------------------//

  HB_FUNC( WOLESHOWEXCEPTION )
  {
     if( (LONG) s_nOleError == DISP_E_EXCEPTION )
     {
        LPSTR source, description;

        source = WideToAnsi( excep.bstrSource );
        description = WideToAnsi( excep.bstrDescription );

        MessageBox( NULL, description, source, MB_ICONHAND );

        hb_xfree( source );
        hb_xfree( description );
     }
  }

  //---------------------------------------------------------------------------//

  HB_FUNC_STATIC( OLEEXCEPTIONSOURCE )
  {
     if( (LONG) s_nOleError == DISP_E_EXCEPTION )
     {
        LPSTR source;

        source = WideToAnsi( excep.bstrSource );
        hb_retcAdopt( source );
     }
  }

  //---------------------------------------------------------------------------//

  HB_FUNC_STATIC( OLEEXCEPTIONDESCRIPTION )
  {
     if( (LONG) s_nOleError == DISP_E_EXCEPTION )
     {
        LPSTR description;

        description = WideToAnsi( excep.bstrDescription );
        hb_retcAdopt( description );
     }
  }

  //---------------------------------------------------------------------------//

  HB_FUNC( WOLEERROR )
  {
     hb_retnl( (LONG) s_nOleError );
  }

  //---------------------------------------------------------------------------//

  static char * WOle2TxtError( void )
  {
     switch( (LONG) s_nOleError )
     {
        case S_OK:
           return "S_OK";

        case CO_E_CLASSSTRING:
           return "CO_E_CLASSSTRING";

        case OLE_E_WRONGCOMPOBJ:
           return "OLE_E_WRONGCOMPOBJ";

        case REGDB_E_CLASSNOTREG:
           return "REGDB_E_CLASSNOTREG";

        case REGDB_E_WRITEREGDB:
           return "REGDB_E_WRITEREGDB";

        case E_OUTOFMEMORY:
           return "E_OUTOFMEMORY";

        case E_NOTIMPL:
           return "E_NOTIMPL";

        case E_INVALIDARG:
           return "E_INVALIDARG";

        case E_UNEXPECTED:
           return "E_UNEXPECTED";

        case DISP_E_UNKNOWNNAME:
           return "DISP_E_UNKNOWNNAME";

        case DISP_E_UNKNOWNLCID:
           return "DISP_E_UNKNOWNLCID";

        case DISP_E_BADPARAMCOUNT:
           return "DISP_E_BADPARAMCOUNT";

        case DISP_E_BADVARTYPE:
           return "DISP_E_BADVARTYPE";

        case DISP_E_EXCEPTION:
           return "DISP_E_EXCEPTION";

        case DISP_E_MEMBERNOTFOUND:
           return "DISP_E_MEMBERNOTFOUND";

        case DISP_E_NONAMEDARGS:
           return "DISP_E_NONAMEDARGS";

        case DISP_E_OVERFLOW:
           return "DISP_E_OVERFLOW";

        case DISP_E_PARAMNOTFOUND:
           return "DISP_E_PARAMNOTFOUND";

        case DISP_E_TYPEMISMATCH:
           return "DISP_E_TYPEMISMATCH";

        case DISP_E_UNKNOWNINTERFACE:
           return "DISP_E_UNKNOWNINTERFACE";

        case DISP_E_PARAMNOTOPTIONAL:
           return "DISP_E_PARAMNOTOPTIONAL";

        case CO_E_SERVER_EXEC_FAILURE:
           return "CO_E_SERVER_EXEC_FAILURE";

        case MK_E_UNAVAILABLE:
           return "MK_E_UNAVAILABLE";

        default:
           TraceLog( NULL, "TOleAutoX Error %p\n", s_nOleError );
           return "Unknown error";
     };
  }

  //---------------------------------------------------------------------------//
  HB_FUNC( WOLE2TXTERROR )
  {
     hb_retc( WOle2TxtError() );
  }

  //---------------------------------------------------------------------------//

  HB_FUNC_STATIC( MESSAGEBOX )
  {
     hb_retni( MessageBox( ( HWND ) hb_parnl( 1 ), hb_parcx( 2 ), hb_parcx( 3 ), hb_parni( 4 ) ) );
  }

  //---------------------------------------------------------------------------//

  HB_FUNC_STATIC( CREATEOLEOBJECT ) // ( cOleName | cCLSID  [, cIID ] )
  {
     BSTR bstrClassID;
     IID ClassID, iid;
     LPIID riid = (LPIID) &IID_IDispatch;
     IDispatch *pDisp;

     bstrClassID = AnsiToSysString( hb_parcx( 1 ) );

     if( hb_parcx( 1 )[ 0 ] == '{' )
     {
        s_nOleError = CLSIDFromString( bstrClassID, (LPCLSID) &ClassID );
     }
     else
     {
        s_nOleError = CLSIDFromProgID( bstrClassID, (LPCLSID) &ClassID );
     }

     SysFreeString( bstrClassID );

     //TraceLog( NULL, "Result: %i\n", s_nOleError );

     if( hb_pcount() == 2 )
     {
        if( hb_parcx( 2 )[ 0 ] == '{' )
        {
           bstrClassID = AnsiToSysString( hb_parcx( 2 ) );
           s_nOleError = CLSIDFromString( bstrClassID, &iid );
           SysFreeString( bstrClassID );
        }
        else
        {
           memcpy( ( LPVOID ) &iid, hb_parcx( 2 ), sizeof( iid ) );
        }

        riid = &iid;
     }

     if( s_nOleError == S_OK )
     {
        //TraceLog( NULL, "Class: %i\n", ClassID );
        pDisp = NULL;
        s_nOleError = CoCreateInstance( (REFCLSID) &ClassID, NULL, CLSCTX_SERVER, (REFIID) riid, (void **) &pDisp );
        //TraceLog( NULL, "Result: %i\n", s_nOleError );
     }

     hb_retnl( ( LONG ) pDisp );
  }

  //---------------------------------------------------------------------------//

  HB_FUNC_STATIC( GETOLEOBJECT ) // ( cOleName | cCLSID  [, cIID ] )
  {
     BSTR bstrClassID;
     IID ClassID, iid;
     LPIID riid = (LPIID) &IID_IDispatch;
     IUnknown *pUnk = NULL;
     IDispatch *pDisp;
     //LPOLESTR pOleStr = NULL;

     s_nOleError = S_OK;

     if( ( s_nOleError == S_OK ) || ( s_nOleError == (HRESULT) S_FALSE) )
     {
        bstrClassID = AnsiToSysString( hb_parcx( 1 ) );

        if( hb_parcx( 1 )[ 0 ] == '{' )
        {
           s_nOleError = CLSIDFromString( bstrClassID, (LPCLSID) &ClassID );
        }
        else
        {
           s_nOleError = CLSIDFromProgID( bstrClassID, (LPCLSID) &ClassID );
        }

        //s_nOleError = ProgIDFromCLSID( &ClassID, &pOleStr );
        //wprintf( L"Result %i ProgID: '%s'\n", s_nOleError, pOleStr );

        SysFreeString( bstrClassID );

        if( hb_pcount() == 2 )
        {
           if( hb_parcx( 2 )[ 0 ] == '{' )
           {
              bstrClassID = AnsiToSysString( hb_parcx( 2 ) );
              s_nOleError = CLSIDFromString( bstrClassID, &iid );
              SysFreeString( bstrClassID );
           }
           else
           {
              memcpy( ( LPVOID ) &iid, hb_parcx( 2 ), sizeof( iid ) );
           }

           riid = &iid;
        }

        if( s_nOleError == S_OK )
        {
           s_nOleError = GetActiveObject( (REFCLSID) &ClassID, NULL, &pUnk );

           if( s_nOleError == S_OK )
           {
              pDisp = NULL;
              s_nOleError = pUnk->lpVtbl->QueryInterface( pUnk, (REFIID) riid, (void **) &pDisp );
           }
        }
     }

     hb_retnl( ( LONG ) pDisp );
  }

  //---------------------------------------------------------------------------//

  HB_FUNC_STATIC( OLERELEASEOBJECT ) // (hOleObject, szMethodName, uParams...)
  {
     IDispatch *pDisp = ( IDispatch * ) hb_parnl( 1 );

     s_nOleError = pDisp->lpVtbl->Release( pDisp );
  }

  //---------------------------------------------------------------------------//

  static void OleSetProperty( IDispatch *pDisp, DISPID DispID, DISPPARAMS *pDispParams )
  {
     // 1 Based!!!
     if( ( s_OleRefFlags && s_OleRefFlags[ 1 ] ) || hb_param( 1, HB_IT_ARRAY ) )
     {
        memset( (LPBYTE) &excep, 0, sizeof( excep ) );

        s_nOleError = pDisp->lpVtbl->Invoke( pDisp,
                                             DispID,
                                             (REFIID) &IID_NULL,
                                             LOCALE_USER_DEFAULT,
                                             DISPATCH_PROPERTYPUTREF,
                                             pDispParams,
                                             NULL,    // No return value
                                             &excep,
                                             &uArgErr );

       if( s_nOleError == S_OK )
       {
          return;
       }
     }

     memset( (LPBYTE) &excep, 0, sizeof( excep ) );

     s_nOleError = pDisp->lpVtbl->Invoke( pDisp,
                                          DispID,
                                          (REFIID) &IID_NULL,
                                          LOCALE_USER_DEFAULT,
                                          DISPATCH_PROPERTYPUT,
                                          pDispParams,
                                          NULL,    // No return value
                                          &excep,
                                          &uArgErr );
  }

  //---------------------------------------------------------------------------//

  static void OleInvoke( IDispatch *pDisp, DISPID DispID, DISPPARAMS *pDispParams )
  {
     memset( (LPBYTE) &excep, 0, sizeof( excep ) );

     s_nOleError = pDisp->lpVtbl->Invoke( pDisp,
                                          DispID,
                                          (REFIID) &IID_NULL,
                                          LOCALE_USER_DEFAULT,
                                          DISPATCH_METHOD,
                                          pDispParams,
                                          &RetVal,
                                          &excep,
                                          &uArgErr );
  }

  //---------------------------------------------------------------------------//

  static void OleGetProperty( IDispatch *pDisp, DISPID DispID, DISPPARAMS *pDispParams )
  {
     memset( (LPBYTE) &excep, 0, sizeof( excep ) );

     s_nOleError = pDisp->lpVtbl->Invoke( pDisp,
                                          DispID,
                                          (REFIID) &IID_NULL,
                                          LOCALE_USER_DEFAULT,
                                          DISPATCH_PROPERTYGET,
                                          pDispParams,
                                          &RetVal,
                                          &excep,
                                          &uArgErr );

  }

  //---------------------------------------------------------------------------//
  HB_FUNC_STATIC( TOLEAUTOX_ONERROR )
  {
     IDispatch *pDisp;
     DISPID DispID;
     DISPPARAMS DispParams;
     BOOL bSetFirst = FALSE;

     //TraceLog( NULL, "Class: '%s' Message: '%s', Params: %i Arg1: %i\n", hb_objGetClsName( hb_stackSelfItem() ), ( *HB_VM_STACK.pBase )->item.asSymbol.value->szName, hb_pcount(), hb_parinfo(1) );

     hb_vmPushSymbol( s_pSym_hObj->pSymbol );
     hb_vmPush( hb_stackSelfItem() );
     hb_vmSend( 0 );

     pDisp = ( IDispatch * ) hb_parnl( -1 );

     if( hb_stackBaseItem()->item.asSymbol.value->szName[0] == '_' && hb_stackBaseItem()->item.asSymbol.value->szName[1] && hb_pcount() >= 1 )
     {
        bstrMessage = AnsiToSysString( hb_stackBaseItem()->item.asSymbol.value->szName + 1 );
        s_nOleError = pDisp->lpVtbl->GetIDsOfNames( pDisp, (REFIID) &IID_NULL, (wchar_t **) &bstrMessage, 1, LOCALE_USER_DEFAULT, &DispID );
        SysFreeString( bstrMessage );
        //TraceLog( NULL, "1. ID of: '%s' -> %i Result: %i\n", ( *HB_VM_STACK.pBase )->item.asSymbol.value->szName + 1, DispID, s_nOleError );

        if( s_nOleError == S_OK )
        {
           bSetFirst = TRUE;
        }
     }
     else
     {
        s_nOleError = E_PENDING;
     }

     if( s_nOleError != S_OK )
     {
        // Try again without removing the assign prefix (_).
        bstrMessage = AnsiToSysString( hb_stackBaseItem()->item.asSymbol.value->szName );
        s_nOleError = pDisp->lpVtbl->GetIDsOfNames( pDisp, (REFIID) &IID_NULL, (wchar_t **) &bstrMessage, 1, 0, &DispID );
        SysFreeString( bstrMessage );
        //TraceLog( NULL, "2. ID of: '%s' -> %i Result: %i\n", ( *HB_VM_STACK.pBase )->item.asSymbol.value->szName, DispID, s_nOleError );
     }

     if( s_nOleError == S_OK )
     {
        GetParams( &DispParams );

        VariantInit( &RetVal );

        if( bSetFirst )
        {
           DispParams.rgdispidNamedArgs = &lPropPut;
           DispParams.cNamedArgs = 1;

           OleSetProperty( pDisp, DispID, &DispParams );
           //TraceLog( NULL, "OleSetProperty %i\n", s_nOleError );

           if( s_nOleError == S_OK )
           {
              hb_itemReturn( hb_stackItemFromBase( 1 ) );
           }
           else
           {
              DispParams.rgdispidNamedArgs = NULL;
              DispParams.cNamedArgs = 0;
           }
        }

        if( bSetFirst == FALSE || s_nOleError != S_OK )
        {
           OleInvoke( pDisp, DispID, &DispParams );
           //TraceLog( NULL, "OleInvoke %i\n", s_nOleError );

           if( s_nOleError == S_OK )
           {
              RetValue();
           }
        }

        // Collections are properties that do require arguments!
        if( s_nOleError != S_OK /* && hb_pcount() == 0 */ )
        {
           OleGetProperty( pDisp, DispID, &DispParams );
           //TraceLog( NULL, "OleGetProperty %i\n", s_nOleError );

           if( s_nOleError == S_OK )
           {
              RetValue();
           }
        }

        if( s_nOleError != S_OK && hb_pcount() >= 1 )
        {
           DispParams.rgdispidNamedArgs = &lPropPut;
           DispParams.cNamedArgs = 1;

           OleSetProperty( pDisp, DispID, &DispParams );
           //TraceLog( NULL, "OleSetProperty %i\n", s_nOleError );

           if( s_nOleError == S_OK )
           {
              hb_itemReturn( hb_stackItemFromBase( 1 ) );
           }
        }

        FreeParams( &DispParams );
     }

     if( s_nOleError == S_OK )
     {
        //TraceLog( NULL, "Invoke Succeeded!\n" );

        if( HB_IS_OBJECT( hb_stackReturnItem() ) )
        {
           HB_ITEM Return;
           HB_ITEM OleClassName;
           char sOleClassName[ 256 ];

           Return.type = HB_IT_NIL;
           hb_itemForwardValue( &Return, hb_stackReturnItem() ) ;


           hb_vmPushSymbol( s_pSym_cClassName->pSymbol );
           hb_vmPush( hb_stackSelfItem() );
           hb_vmSend( 0 );

           strncpy( sOleClassName, hb_parc( - 1 ), hb_parclen( -1 ) );
           sOleClassName[ hb_parclen( -1 ) ] = ':';
           strcpy( sOleClassName + hb_parclen( -1 ) + 1, hb_stackBaseItem()->item.asSymbol.value->szName );

           //TraceLog( NULL, "Class: '%s'\n", sOleClassName );

           OleClassName.type = HB_IT_NIL;
           hb_itemPutC( &OleClassName, sOleClassName );

           hb_vmPushSymbol( s_pSym_cClassName->pSymbol );
           hb_vmPush( &Return );
           hb_itemPushForward( &OleClassName );
           hb_vmSend( 1 );

           hb_itemReturn( &Return );
        }
     }
     else
     {
        PHB_ITEM pReturn;
        char *sDescription;

        //TraceLog( NULL, "Invoke Failed!\n" );

        hb_vmPushSymbol( s_pSym_cClassName->pSymbol );
        hb_vmPush( hb_stackSelfItem() );
        hb_vmSend( 0 );

        if( s_nOleError == DISP_E_EXCEPTION )
        {
           // Intentional to avoid report of memory leak if fatal error.
           char *sTemp = WideToAnsi( excep.bstrDescription );
           sDescription = (char *) malloc( strlen( sTemp ) + 1 );
           strcpy( sDescription, sTemp );
           hb_xfree( sTemp );
        }
        else
        {
           sDescription = WOle2TxtError();
        }

        //TraceLog( NULL, "Desc: '%s'\n", sDescription );

        pReturn = hb_errRT_SubstParams( hb_parcx( -1 ), EG_OLEEXECPTION, (ULONG) s_nOleError, sDescription, hb_stackBaseItem()->item.asSymbol.value->szName );

        if( s_nOleError == DISP_E_EXCEPTION )
        {
           free( (void *) sDescription );
        }

        if( pReturn )
        {
           hb_itemReturn( pReturn );
        }
     }
  }

#pragma ENDDUMP


//----------------------------------------------------------------------------//
INIT PROCEDURE Initialize_Ole
//----------------------------------------------------------------------------//

   IF ! bOleInitialized
      bOleInitialized := .T.
      Ole_Initialize()
   ENDIF

RETURN

//----------------------------------------------------------------------------//
EXIT PROCEDURE __DEACTIVATE__OLE
//----------------------------------------------------------------------------//

   UnInitialize_ole()

Return

//----------------------------------------------------------------------------//
PROCEDURE UnInitialize_Ole
//----------------------------------------------------------------------------//

   IF bOleInitialized
      bOleInitialized := .F.
      Ole_UnInitialize()
   ENDIF

RETURN	 
Delpji 7, harbour 3.2, xharbour 1.2.3, Bcc7, Minigw, Minigui 19.11, hwgui 2.20, FiveWin 19.05 Gtwvw, Gtwvg, C# VS 2017
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

E-social Consulta

Mensagem por JoséQuintas »

Ok, se entendi, simplificando, no xHarbour troca win_OleCreateObject() por xhb_CreateObject()

Eu acho que tem um detalhe a mais aí: Precisa certificado.
Acontece que quando já usou certificado, assume o último certificado que foi usado.
Caso precise, vai ser interessante já ajustar o SOAP pra ficar certificado configurado.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
jairfab
Usuário Nível 3
Usuário Nível 3
Mensagens: 252
Registrado em: 21 Mai 2007 09:43
Localização: São Paulo, Região Leste - Suzano

E-social Consulta

Mensagem por jairfab »

confere, é isto mesmo!
Delpji 7, harbour 3.2, xharbour 1.2.3, Bcc7, Minigw, Minigui 19.11, hwgui 2.20, FiveWin 19.05 Gtwvw, Gtwvg, C# VS 2017
Eroni
Usuário Nível 1
Usuário Nível 1
Mensagens: 20
Registrado em: 18 Mai 2015 09:15
Localização: Criciuma/SC

E-social Consulta

Mensagem por Eroni »

Boa noite.
Jair, copiei e colei o seu código e na execução gerou o erro abaixo:

Código: Selecionar todos

Application
===========
   Path and name: D:\Tmp\Teste\Teste.Exe (32 bits)
   Size: 1,910,784 bytes
   Compiler version: xHarbour build 1.2.1 Intl. (SimpLex) (Rev. 9656)
   FiveWin  Version: FWHX 12.08
   Windows version: 6.2, Build 9200 

   Time from start: 0 hours 0 mins 0 secs 
   Error occurred at: 09/12/17, 21:59:03
   Error description: Error MSXML2.XMLHTTP/14  DISP_E_BADPARAMCOUNT: SEND
   Args:
     [   1] = C   <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://www.esocial.gov.br/servicos/empregador/lote/eventos/envio/consulta/retornoProcessamento/v1_1_0"><soapenv:Header/><soapenv:Body><consultaLoteEventos><consulta><eSocial xmlns="http://www.esocial.gov.br/schema/lote/eventos/envio/consulta/retornoProcessamento/v1_0_0"><consultaLoteEventos><protocoloEnvio>1.2.201709.0000000000000226099</protocoloEnvio></consultaLoteEventos></eSocial></consulta></consultaLoteEventos></soapenv:Body></soapenv:Envelope>

Stack Calls
===========
   Called from: Source\main.prg => TOLEAUTOX:SEND( 0 )
   Called from: Source\main.prg => ESOCIALCLASS:MICROSOFTXMLSOAPPOST( 95 )
   Called from: Source\main.prg => ESOCIALCLASS:CONSULTARETORNOLOTE( 76 )
   Called from: Source\main.prg => MAIN( 18 )
Acrescentando a linha que pega o certificado:
:cCertificado := "SERASA Certificadora Digital v2"
oComunicacao:setOption( 3, "CURRENT_USER\MY\" + ::cCertificado ), ao executar, gera o erro:

Código: Selecionar todos

Application
===========
   Path and name: D:\Tmp\Teste\Teste.Exe (32 bits)
   Size: 1,911,296 bytes
   Compiler version: xHarbour build 1.2.1 Intl. (SimpLex) (Rev. 9656)
   FiveWin  Version: FWHX 12.08
   Windows version: 6.2, Build 9200 

   Time from start: 0 hours 0 mins 0 secs 
   Error occurred at: 09/12/17, 22:04:17
   Error description: Error MSXML2.XMLHTTP/3  DISP_E_MEMBERNOTFOUND: SETOPTION
   Args:
     [   1] = N   3
     [   2] = C   CURRENT_USER\MY\SERASA Certificadora Digital v2

Stack Calls
===========
   Called from: Source\main.prg => TOLEAUTOX:SETOPTION( 0 )
   Called from: Source\main.prg => ESOCIALCLASS:MICROSOFTXMLSOAPPOST( 90 )
   Called from: Source\main.prg => ESOCIALCLASS:CONSULTARETORNOLOTE( 76 )
   Called from: Source\main.prg => MAIN( 18 )
Ou seja, estou inclinado a acreditar que o objeto retornado por xHB_CreateObject( "MSXML2.XMLHTTP" ) não está correto. Vc tem um exe rodando com este seu código? Poderia tentar colocar a minha ID para ver se consegue?
GRato.
xHarbour 1.2.1 FiveWin 1209 SQLRDD-SQLEX-xHarbour.org-March2010-build31
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

E-social Consulta

Mensagem por JoséQuintas »

Sobre o SetOption:

Também pensei nisso a primeira vez, mas não tem nada a ver.

XMLHTTP não é a mesma coisa de ServerXMLHTTP, só o segundo é que tem SetOption() pra definir certificado.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder