Ir para conteúdo
  • Cadastre-se

dev botao

Erro No Acesso A Sat.dll


Ver Solução Respondido por ricaalm,
  • Este tópico foi criado há 2104 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

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.

Postado

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

 

Postado

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
  • Solution
Postado

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
  • 2 anos depois...
Postado
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?

 

  • 2 anos depois...
Postado
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.

  • Curtir 2
  • Este tópico foi criado há 2104 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...