• 0
Entre para seguir isso  
ricaalm

Erro No Acesso A Sat.dll

Pergunta

ricaalm    1

Bom dia engenheiros
Peço desculpa caso esteja postando em forum errado. Estou iniciando um projeto de um aplicativo comercial que ira trabalhar com o S@T. Já há alguns dias estou queimando a pestana na tentativa de comunicar meu aplicativo com a SAT.DLL disponibilizada para testes pelo SEFAZ. Meu aplicativo esta sendo desenvolvido em VB.NET. Ao acionar a DLL recebo o seguinte erro:

 

 

"Uma chamada para a função PInvoke 'TesteAcessoSAT!TesteAcessoSAT.Module1::ConsultarSAT' desbalanceou a pilha. Isso ocorreu provavelmente porque a assinatura gerenciada de PInvoke não corresponde à assinatura de destino não gerenciada. Verifique se a convenção e o parâmetro de chamada da assinatura de PInvoke são iguais aos da assinatura não gerenciada de destino."

 

O código que fiz para teste é bastante simples, criei um modulo e defini a DLL conforme abaixo: 

Module SAT
 
    Public Declare Ansi Function myConsultarSAT Lib "C:\SAT\SAT.DLL" Alias "ConsultarSAT" (ByVal numeroSessao As Integer) As String

End Module

Em seguida, criei um código para acessar esta DLL como segue:

Public Sub Main() 

    Dim strRetorno As String
    Dim Randomizer As New Random
    Dim Sessao As Integer
    
    Sessao = Randomizer.Next(1, 1000000)

    Try
        strRetorno = myConsultarSAT(Sessao)
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try

End Sub

Ao executar verifico que a chamada até é feita pois aparece no log do emulador do SEFAZ, mas o erro que informei é demonstrado na tela e nenhum valor retorna para meu aplicativo.

 

alguém já passou por isso ou tem alguma dica ? Já procurei em diversos forums e sites especializados e atá agora não encontrei nada que pudesse me ajudar. 

 

Fico imensamente grato caso alguém possa me auxiliar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

7 respostass a esta questão

Recommended Posts

  • 0
ricaalm    1

Boa noite engenheiros

Esta noite vou finalmente conseguir dormir porque encontrei a solução. O problema é que a SAT.DLL foi construída em C e o tratamento de tamanhos e endereçamento de variáveis do C é diferente daquele utilizado pelo .NET. Por isso é necessário obter o retorno da chamada da função através do endereçamento de memória da variável e não da variável propriamente dita. Para isto é preciso utilizar um ponteiro. Fiz da seguinte forma caso alguém precise?

 

Vinculação da DLL dentro da classe pelo PInvoke:

<DllImport("c:\SAT\SAT.dll", CallingConvention:=CallingConvention.Cdecl)> _
Public Function ConsultarSAT(ByVal nSessionRandom As Int32) As IntPtr
End Function

Chamada da função e leitura do resultado na memória: 

 Dim cmdLineStr As IntPtr = ConsultarSAT(Sessao)
 Dim strResposta As String = Marshal.PtrToStringAnsi(cmdLineStr)
 MsgBox(strResposta)

Agora esta funfando legal e estou indo em frente até o próximo buraco, obrigado a todos que tentaram ajudar.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • 0
Régys Silveira    1.464

Esse fórum especifico é somente para o ACBrSAT, componente da suíte ACBr feito em Delphi para utilização do SAT.

Vou mover para outra área do fórum de dúvidas gerais onde talvez alguém possa lhe ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • 0
Rafael Dias    166

Tenta usar o atributo DllImport deve ser algo mais ou menos assim em vb.net

<DllImport("C:\SAT\SAT.DLL", EntryPoint="ConsultarSAT", CallingConvention:=CallingConvention.StdCall)>
Public Shared Function myConsultarSAT (ByVal numeroSessao As Integer) As String

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • 0
ricaalm    1

Pois é Rafael, eu já tentei definir desta forma também mas dá o mesmo erro:

<DllImport("C:\SAT\SAT.DLL", CallingConvention:=CallingConvention.StdCall)> _
Public Function ConsultarSAT(ByRef numeroSessao As Integer) As String
End Function

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • 0
Em 29/04/2014 at 19:47, ricaalm disse:

Boa noite engenheiros

Esta noite vou finalmente conseguir dormir porque encontrei a solução. O problema é que a SAT.DLL foi construída em C e o tratamento de tamanhos e endereçamento de variáveis do C é diferente daquele utilizado pelo .NET. Por isso é necessário obter o retorno da chamada da função através do endereçamento de memória da variável e não da variável propriamente dita. Para isto é preciso utilizar um ponteiro. Fiz da seguinte forma caso alguém precise?

 

Vinculação da DLL dentro da classe pelo PInvoke:


<DllImport("c:\SAT\SAT.dll", CallingConvention:=CallingConvention.Cdecl)> _
Public Function ConsultarSAT(ByVal nSessionRandom As Int32) As IntPtr
End Function

Chamada da função e leitura do resultado na memória: 


 Dim cmdLineStr As IntPtr = ConsultarSAT(Sessao)
 Dim strResposta As String = Marshal.PtrToStringAnsi(cmdLineStr)
 MsgBox(strResposta)

Agora esta funfando legal e estou indo em frente até o próximo buraco, obrigado a todos que tentaram ajudar.

Parabéns, Vc conseguiu a função para enviar dados de venda?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

Entre para seguir isso  

  • Atenção !!  Este tópico está sem resposta há mais de 120 dias.