PROBLEMAS COM SAT.DLL

RICAALM 28/04/2014 20:17:09
#437713
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

PROGRAMADORVB6 29/04/2014 17:07:16
#437767
Olá
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
RICAALM 29/04/2014 18:44:15
#437770
Citação:

:
Olá
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



Eu não conheço esta instrução Imports SampleDLL.sat, não funcionou aqui. O que seria Sample.sat ?
RICAALM 29/04/2014 19:34:32
#437775
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:

  <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