PROBLEMAS COM SAT.DLL
Pessoal
Sou novo por aqui e vim humildemente ver se alguém pode me ajudar com meu problema. Estou iniciando os estudos para desenvolver um aplicativo comercial para trabalhar com o projeto de NFC-e S@AT.
Baixei toda a documentação do site SEFAZ e também o emulador juntamente com a dll de teste SAT.DLL. Estou tendo problemas ao adicionar esta DLL em meu aplicativo. Em qualquer método que eu tente acionar, recebo o seguinte erro:
A call to PInvoke function [ô]TesteAcessoSAT!TesteAcessoSAT.Module1::ConsultarSAT[ô] has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.
Para inserir a DLL ao meu projeto usei o código:
Public Declare Auto Function ConsultarSAT Lib [Ô]C:\SAT\SAT.DLL[Ô] (ByVal numeroSessao As IntPtr) As String
Para acionar defini o seguinte código:
Private strRetorno As String
Dim codigoAtivacao As String = [Ô]teste2014[Ô]
Dim CNPJ = [Ô]11111111111111[Ô]
Dim Randomizer As New Random
Dim Sessao As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Sessao = Randomizer.Next(1, 1000000)
Try
strRetorno = ConsultarSAT(Sessao)
Catch ex As Exception
MsgBox(ex.Message)
End Try
[ô]MsgBox(strRetorno)
End Sub
Algúem já passou por isso ou saberia dizer onde esta o problema ?
Obrigado
Sou novo por aqui e vim humildemente ver se alguém pode me ajudar com meu problema. Estou iniciando os estudos para desenvolver um aplicativo comercial para trabalhar com o projeto de NFC-e S@AT.
Baixei toda a documentação do site SEFAZ e também o emulador juntamente com a dll de teste SAT.DLL. Estou tendo problemas ao adicionar esta DLL em meu aplicativo. Em qualquer método que eu tente acionar, recebo o seguinte erro:
A call to PInvoke function [ô]TesteAcessoSAT!TesteAcessoSAT.Module1::ConsultarSAT[ô] has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.
Para inserir a DLL ao meu projeto usei o código:
Public Declare Auto Function ConsultarSAT Lib [Ô]C:\SAT\SAT.DLL[Ô] (ByVal numeroSessao As IntPtr) As String
Para acionar defini o seguinte código:
Private strRetorno As String
Dim codigoAtivacao As String = [Ô]teste2014[Ô]
Dim CNPJ = [Ô]11111111111111[Ô]
Dim Randomizer As New Random
Dim Sessao As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Sessao = Randomizer.Next(1, 1000000)
Try
strRetorno = ConsultarSAT(Sessao)
Catch ex As Exception
MsgBox(ex.Message)
End Try
[ô]MsgBox(strRetorno)
End Sub
Algúem já passou por isso ou saberia dizer onde esta o problema ?
Obrigado
Olá
Talvez usares assim a dll
Talvez usares assim a dll
Imports SampleDLL.sat
Public Class form
Dim objSat As New SampleDLL.sat
Private Sub btnShow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
Me.Textbox1.Text = objSat.Addition(Val(txtNo1.Text), Val(txtNo2.Text))
End Sub
End Class
Citação::
Olá
Talvez usares assim a dllImports SampleDLL.sat
Public Class form
Dim objSat As New SampleDLL.sat
Private Sub btnShow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
Me.Textbox1.Text = objSat.Addition(Val(txtNo1.Text), Val(txtNo2.Text))
End Sub
End Class
Eu não conheço esta instrução Imports SampleDLL.sat, não funcionou aqui. O que seria Sample.sat ?
Então engenheiros, tive mesmo que queimar a pestana e resolver sozinho na base de tentativa e erro, mas felizmente encontrei a solução. que posto abaixo caso alguém precise:
O problema todo é que a DLL não é nativa do .NET, foi compilada em C e por isso tem tratamento de endereçamento de memória diferente do Framework da Microsoft. O apontamento do endereço e tamanho das variáveis de retorno da função não coincidem com as variáveis criadas pelo .NET. Para resolver tive criar ponteiros de memória e ler o retorno a partir deste ponteiros conforme segue:
Vinculação da DLL pelo PInvoke:
Acionamento da função e leitura do retorno através do ponteiro de memória:
Agora esta funfando legal, agradeço a todos engenheiros que tentaram de alguma forma ajudar.
O problema todo é que a DLL não é nativa do .NET, foi compilada em C e por isso tem tratamento de endereçamento de memória diferente do Framework da Microsoft. O apontamento do endereço e tamanho das variáveis de retorno da função não coincidem com as variáveis criadas pelo .NET. Para resolver tive criar ponteiros de memória e ler o retorno a partir deste ponteiros conforme segue:
Vinculação da DLL pelo PInvoke:
<DllImport([Ô]c:\SAT\SAT.dll[Ô], CallingConvention:=CallingConvention.Cdecl)> _
Public Function ConsultarSAT(ByVal nSessionRandom As Int32) As IntPtr
End Function
Acionamento da função e leitura do retorno através do ponteiro de memória:
Sessao = Randomizer.Next(1, 1000000)
Dim cmdLineStr As IntPtr = ConsultarSAT(Sessao)
Dim strA As String = Marshal.PtrToStringAnsi(cmdLineStr)
MsgBox(strA)
Agora esta funfando legal, agradeço a todos engenheiros que tentaram de alguma forma ajudar.
Tópico encerrado , respostas não são mais permitidas