Jump to content

Promoção 25 Anos de Delphi
25% de desconto em todas as versões

Saiba mais

Ganhe o curso Tributação NF-e para Desenvolvedores

Assinando o SAC Anual este mês
botao.png

 

Balança SM100 performance surpreendente

Tecnologia Japonesa   Teclado e Visor resistentes a água
Consumo inteligente de etiquetas   Baixo custo de manutenção
Comunicação Ethernet e WIFI independentes

Saiba Mais

Impressora de Etiquetas ELGIN - L42 PRO

Protocolos PPLA, PPLB, ZPL, EPL (automático)
Porta USB padrão Opcionais: Ethernet, Serial, Paralela
Sensor de Etiquetas Móvel Garantia de 18 meses

Saiba mais

Sign in to follow this  
ricaalm

ANSWERED Erro No Acesso A Sat.dll

Recommended Posts

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 [email protected] 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.

Share this post


Link to post
Share on other sites

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

Consultor SAC ACBr Rafael Dias
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Desenvolvedor ACBrLib.

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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.

  • Like 1

Share this post


Link to post
Share on other sites
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?

 

Share this post


Link to post
Share on other sites
Em 29/04/2014 at 09:25, Rafael Dias disse:

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

Troca o StdCall por Cdecl que funfa.

  • Like 2

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  

×
×
  • Create New...