Ir para conteúdo
Fórum Script Brasil
  • 0

ERRO ao chamar DLL Feita em C


Airton Farias

Pergunta

Boa Tarde, estou tendo um problema ao chamar uma funcao de uma DLL desenvolvida em C++.

Ao chamar a DLL o VB gera o seguinte erro: bad dll calling convertion cuja tradução que encontrei na net é: Má convenção de chamada de DLL

Na documentação da DLL diz:

int DLLATO17GeraArquivo (char *szArquivoBinario, char *szArquivoTexto, char *szPeriodoIni, char *szPeriodoFIM, char TipoPeriodo, char *szUsuario, char *szTipoLeitura);

Parâmetros

<szArquivoBinario> – Nome do arquivo binário criado pela DLL de Leitura a partir de onde serão lidos os dados.

<szArquivoTexto> – Nome do arquivo de texto que conterá os dados gerados no formato do ATO COTEPE ICMS 17/04.

<szPeriodoIni> – Texto que deve indicar o início do período a partir do qual será realizada a geração do arquivo.

<szPeriodoFIM> –Texto que deve indicar o final do período a partir do qual será realizada a geração do arquivo.

<TipoPeriodo> – Caracter que Indica como deve ser interpretados os parâmetros <szPeriodoIni> e <szPeriodoFIM>. Eles serão interpretados de acordo com a tabela abaixo: 'D' ou 'M' ou 'C'

No desenvolvimento em VB6 estou realizando assim:

Declare Function DLLATO17GeraArquivo Lib "ATO17.dll" (ByVal szArquivoBinario As String, ByVal szArquivoTexto As String, ByVal szPeriodoIni As String, ByVal szPeriodoFIM As String, TipoPeriodo As Byte, ByVal szUsuario As String, ByVal szTipoLeitura As String) As Integer

Para chamar a funcao estou testando conforme segue:

iresposta = DLLATO17GeraArquivo("c:\ato\TESTE.TDM", "c:\ato\TESTE2.TXT", "20080701", "20080730", M, "1", "TDM")

Agradeço muito pelo apoio deste forum.

Abraços,

Airton

Editado por Airton Farias
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

acho q o problema é q no visual basic você declarou TipoPeriodo como byte. e na funcao original esta como char.

de uma olhada aqui:

<TipoPeriodo> – Caracter que Indica como deve ser interpretados os parâmetros <szPeriodoIni> e <szPeriodoFIM>. Eles serão interpretados de acordo com a tabela abaixo: 'D' ou 'M' ou 'C'

como você vai passar D, M ou C como byte?? se não me engano o c consegue pegar pelo codigo ascii sem precisar de conversao, mas acho q você não vai conseguir declarar como tipo diferente no visual basic.

e olha aqui como você esta chamando:

iresposta = DLLATO17GeraArquivo("c:\ato\TESTE.TDM", "c:\ato\TESTE2.TXT", "20080701", "20080730", M, "1", "TDM")

por acaso o M é uma variavel, ou você queria passar a string "M"?? se for a string, você tem q passar entre aspas.

essa dll foi você q fez??

Link para o comentário
Compartilhar em outros sites

  • 0
acho q o problema é q no visual basic você declarou TipoPeriodo como byte. e na funcao original esta como char.

de uma olhada aqui:

<TipoPeriodo> – Caracter que Indica como deve ser interpretados os parâmetros <szPeriodoIni> e <szPeriodoFIM>. Eles serão interpretados de acordo com a tabela abaixo: 'D' ou 'M' ou 'C'

como você vai passar D, M ou C como byte?? se não me engano o c consegue pegar pelo codigo ascii sem precisar de conversao, mas acho q você não vai conseguir declarar como tipo diferente no visual basic.

e olha aqui como você esta chamando:

iresposta = DLLATO17GeraArquivo("c:\ato\TESTE.TDM", "c:\ato\TESTE2.TXT", "20080701", "20080730", M, "1", "TDM")

por acaso o M é uma variavel, ou você queria passar a string "M"?? se for a string, você tem q passar entre aspas.

essa dll foi você q fez??

Caro Kuroi, primeiramente obrigado por sua atenção dispensada.

Referente a dll a mesma é do fabricante de ECF (Equipamento Cupom Fiscal) ZPM Indústria e Comercio LTDA.

Eu declarei a TipoPeriodo como byte, pois não encontrei char no VB6, e como char corresponde a 1 byte, o unico tipo foi o byte mesmo.

Referente a passagem do valor a este parâmetro (valores D,M ou C) estou passando diretamente, pois tentei passar como string e não funcionou. Teria uma outra maneira de passar ou outro tipo de dado que equivalesse a char.

No documento da DLL todos os parâmetros recebem um ponteiro de string, e o único que não recebe é o TipoPeriodo, onde acredito que possa ser este o problema.

Desde já agradeço pelo apoio.

Airton Farias

Link para o comentário
Compartilhar em outros sites

  • 0
Referente a passagem do valor a este parâmetro (valores D,M ou C) estou passando diretamente, pois tentei passar como string e não funcionou. Teria uma outra maneira de passar ou outro tipo de dado que equivalesse a char.

quando você tentou passar como string, qual a mensagem de erro q deu?? a mesma q você postou acima??

e quando da essa mensagem de erro, qual linha ele aponta?? a linha da declaracao ou a linha q chama a funcao??

a declaracao no visual basic, foi você q fez na mao, ou você pegou de algum outro exemplo, de algum manual alguma coisa assim??

tipo não lembro quase q nd desses detalhes de c, mas vi q você não declarou o TipoPeriodo com ByVal. qual seria o motivo?? é porque ele não esta como ponteiro em c?? já tentou por o ByVal pra ver se funciona??

porque tipo, não lembro direito, mas o ponteiro de string, significa q se o parametro for um array de char, ele vai saber a posicao inicial da memoria e vai poder ler a string toda, certo?? como o TipoPeriodo é um caracter só, ele não precisa do ponteiro.

mas mesmo assim acho q precisaria do ByVal não?? porque tipo, o valor do parametro não pode ser alterado. então tem q ser ByVal.

e sera q os parametros com ponteiros não precisariam ser ByRef?? seila, acho q você deveria dar uma olhada nessa parte tb.

bom, tb posso sugerir essas opcoes:

1. declare como byte e passe o valor do caractere na tabela ascii.

2. declare como string e passe o proprio caractere (exemplo: "M")

e se você entender ingles, tb pode tentar da uma lida aqui ó: http://sandsprite.com/CodeStuff/Writing_A_C_Dll_for_VB.html

veja ai o q você consegue, qualquer coisa poste de novo.

EDITADO:

ou veja esse link aqui q deve resolver seu problema: http://www.planet-source-code.com/vb/scrip...83&lngWId=1

esse programa consegue ler a funcao da dll e gera automaticamente o codigo da declaracao do visual basic (alias, eu ate já tinha baxado um desse antes pra ler apis, não sei se é o mesmo).

de acordo com ele sua funcao fica assim:

Public Declare Function DLLATO17GeraArquivo Lib "libname" ( ByRef szArquivoBinario As String, ByRef szArquivoTexto As String, ByRef szPeriodoIni As String, ByRef szPeriodoFIM As String, ByVal TipoPeriodo As String, ByRef szUsuario As String, ByRef szTipoLeitura As String )  As Long

Editado por kuroi
Link para o comentário
Compartilhar em outros sites

  • 0
Referente a passagem do valor a este parâmetro (valores D,M ou C) estou passando diretamente, pois tentei passar como string e não funcionou. Teria uma outra maneira de passar ou outro tipo de dado que equivalesse a char.

quando você tentou passar como string, qual a mensagem de erro q deu?? a mesma q você postou acima??

Quando tento passar como string, nem consigo compilar e gera o erro Run-Time error '13' - Type mismatch

e quando da essa mensagem de erro, qual linha ele aponta?? a linha da declaracao ou a linha q chama a funcao??

a declaracao no visual basic, foi você q fez na mao, ou você pegou de algum outro exemplo, de algum manual alguma coisa assim??

Sim, foi Eu quem fiz na mão.

tipo não lembro quase q nd desses detalhes de c, mas vi q você não declarou o TipoPeriodo com ByVal. qual seria o motivo?? é porque ele não esta como ponteiro em c?? já tentou por o ByVal pra ver se funciona??

porque tipo, não lembro direito, mas o ponteiro de string, significa q se o parametro for um array de char, ele vai saber a posicao inicial da memoria e vai poder ler a string toda, certo?? como o TipoPeriodo é um caracter só, ele não precisa do ponteiro.

mas mesmo assim acho q precisaria do ByVal não?? porque tipo, o valor do parametro não pode ser alterado. então tem q ser ByVal.

e sera q os parametros com ponteiros não precisariam ser ByRef?? seila, acho q você deveria dar uma olhada nessa parte tb.

Bem, li que no visual basic quando passamos string para uma função que declaramos como byval, estamos na verdade passando o ponteiro desta variável, ou seja justamente o que a funçao da dll aguarda. Agora, quando declaro como byref, até consigo compilar mas gera o erro de Run-Time error '6': Overflow

bom, tb posso sugerir essas opcoes:

1. declare como byte e passe o valor do caractere na tabela ascii.

UFA, Estava aqui respondendo seu email quando funcionou com esta opção.

2. declare como string e passe o proprio caractere (exemplo: "M")

e se você entender ingles, tb pode tentar da uma lida aqui ó: http://sandsprite.com/CodeStuff/Writing_A_C_Dll_for_VB.html

veja ai o q você consegue, qualquer coisa poste de novo.

EDITADO:

ou veja esse link aqui q deve resolver seu problema: http://www.planet-source-code.com/vb/scrip...83&lngWId=1

esse programa consegue ler a funcao da dll e gera automaticamente o codigo da declaracao do visual basic (alias, eu ate já tinha baxado um desse antes pra ler apis, não sei se é o mesmo).

de acordo com ele sua funcao fica assim:

Public Declare Function DLLATO17GeraArquivo Lib "libname" ( ByRef szArquivoBinario As String, ByRef szArquivoTexto As String, ByRef szPeriodoIni As String, ByRef szPeriodoFIM As String, ByVal TipoPeriodo As String, ByRef szUsuario As String, ByRef szTipoLeitura As String )  As Long

Concluindo......... Resolvido........ Solucionado......

Conforme orientações do Kuroi, coloquei o Byval na declaração da função no parâmetro TipoPeriodo e passei o valor decimal ASCII da letra M.

A Declaração ficou assim:

Declare Function DLLATO17GeraArquivo Lib "ATO17.dll" (ByVal szArquivoBinario As String, ByVal szArquivoTexto As String, ByVal szPeriodoIni As String, ByVal szPeriodoFIM As String, ByVal TipoPeriodo As Byte, ByVal szUsuario As String, ByVal szTipoLeitura As String) As Integer

A chamada da função ficou assim:

iresposta = DLLATO17GeraArquivo("c:\ato\TESTE.TDM", "c:\ato\TESTE1.TXT", "20080801", "20080830", 77, "1", "TDM")

Kuroi, muito obrigado de coração. Que Deus sempre te ilumine seus caminho, e continue sendo esta pessoa sempre prestativa.

Obrigado!

Obrigado!

Obrigado!

Airton Farias

Editado por Airton Farias
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...