AJUDA A ALTERAR CODIGO - PINVOKE

CARLOSHMONTEIRO 05/03/2014 22:16:32
#435568
Alguém poderia me ajudar a alterar o código da função abaixo, em especial a esta parte: [Ô]tam = lstrlen(lpString)[Ô] - Pinvoke.

Só esta faltando esta parte para concluir.

Private Declare Function lstrlen Lib [Ô]kernel32[Ô] Alias [Ô]lstrlenA[Ô] (ByVal lpString As Object) As Long
Private Declare Sub CopyMemory Lib [Ô]kernel32[Ô] Alias [Ô]RtlMoveMemory[Ô] (hpvDest As Object, hpvSource As Object, ByVal cbCopy As Long)
Private Declare Function GeraS Lib [Ô]C:\...[Ô] (ByVal CodC As Integer, ByVal CodTipoAto As Integer) As Long


Public Function PtrToStr(ByVal lpString As Long) As String
Dim tam As Long
Dim s As New String(vbNullChar, tam)

tam = lstrlen(lpString)

If (tam > 0) Then
Call CopyMemory(s, lpString, tam)
PtrToStr = s
End If
End Function

Essa função é utilizada neste evento:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim CodC As Integer
Dim CodTipoAto As Integer

sRetorno = PtrToStr(GeraS(CodC, CodTipoAto))
TextBox1.Text = sRetorno
End Sub

Fico no aguardo.

Obrigado,
Atenciosamente,
Carlos.
ASHKATCHUP 06/03/2014 09:13:26
#435577
Resposta escolhida
Primeiro tu precisa atribuir o valor à variavel TAM para depois criar a variável S.

Testa ai.



Public Function PtrToStr(ByVal lpString As Long) As String
Dim tam As Long
[ô]
tam = lstrlen(lpString)
[ô]
Dim s As New String(vbNullChar, tam)

If (tam > 0) Then
Call CopyMemory(s, lpString, tam)
PtrToStr = s
End If
End Function

CARLOSHMONTEIRO 06/03/2014 19:56:08
#435618
Olá ASHKATCHUP, boa noite!

Infelizmente não funcionou.
Lendo em alguns artigos e posts em alguns fóruns, me indicam utilizar Marshal.PtrToString()

No entanto, não entendi muito bem.

Utilizando a função acima, ele me dá um erro [Ô]Pinvoke Stack Imbalance[Ô].

Fico no aguardo.

Obrigado,
Atenciosamente,
Carlos.
CARLOSHMONTEIRO 06/03/2014 21:56:25
#435626
Alterando a função acima para IntPtr, e descrevendo a parte do evento, testo assim:

Private Declare Function GeraS Lib [Ô]C:\...[Ô] (ByVal CodC As Integer, ByVal CodTipoAto As Integer) As IntPtr

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim CodC As Integer
Dim CodTipoAto As Integer

sRetorno = Marshal.PtrToStringAuto(GeraS(CodC, CodTipoAto))
TextBox1.Text = sRetorno
End Sub

No entanto o retorno que vem esta errado. Não vem em String.
Acredito que esteja deixando algo de fora, no entanto, não sei o que é. Poderiam me ajudar?
ASHKATCHUP 07/03/2014 23:21:37
#435671
Tenta usar assim:


sRetorno = Marshal.PtrToStringAnsi(GeraS(CodC, CodTipoAto))
CARLOSHMONTEIRO 09/03/2014 22:12:32
#435744
Olá ASHKATCHUP, boa noite!

Obrigado, resolveu.

Tópico encerrado , respostas não são mais permitidas