Ir para conteúdo
  • Cadastre-se

dev botao

Funções UltimoRetorno(), Nome() e Versao() não funcionam


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

Recommended Posts

Bom dia,

Estou utilizando a DLL ACBrMail32.dll para envio de e-mails, tudo funciona conforme esperado com exceção das funções que retornam strings, tais como MAIL_Nome(), MAIL_Versao() e MAIL_UltimoRetorno().

Elas retornam -10 indicando que houve falha na execução do método, além disso os parâmetros passados por referência não retornam com nenhuma informação.

Estou utilizando a linguagem xHarbour (comercial), as funções da DLL foram declaradas da seguinte forma:

xDllMail:=LoadLib32("ACBrMail32.dll")
DLL32 Function MAIL_UltimoRetorno(vMsgRet AS STRING, vTamBuf AS _INT) AS _INT PASCAL FROM "MAIL_UltimoRetorno" LIB xDllMail
DLL32 Function MAIL_Nome(vMsgRet AS STRING, vTamBuf AS _INT) AS _INT PASCAL FROM "MAIL_Nome" LIB xDllMail

A chamadas foram feitas de seguinte forma (após MAIL_Inicializar(), etc...)

// Verifica último retorno
nRetorno := 0
vArqLog:="C:\logACBr.txt"
vLog := ""
nBufferLen := 256
vBuffer := Space(nBufferLen)
nRetorno := MAIL_UltimoRetorno(@vBuffer, @nBufferLen)
vLog+="Tamanho do buffer..: " + Str(nBufferLen)
vLog+="Conteúdo do buffer.: " + vBuffer
vLog+="Retorno da função..: " + Str(nRetorno)
MemoWrit(vArqLog, vLog)

Saída do log fica

Tamanho do buffer..: 256
Conteúdo do buffer.: 
Retorno da função..: -10

Observação 01: se eu substituir MAIL_UltimoRetorno por MAIL_Nome() ou MAIL_Versao() a saída do log continua a mesma...

Observação 02: Os demais métodos tais como MAIL_ConfigGravaValor(), MAIL_AddAddress(), MAIL_Send() funciona perfeitamente

 

Link para o comentário
Compartilhar em outros sites

Olha eu não conheço muito de Harbour, mas so posso assumir que sua declaração esteja errada e recomendar o uso da classe que o projeto disponibiliza.
Veja o primeiro parâmetro é um PChar ou seja um ponteiro de char, e o segundo é um long por referencia e o retorno é um long, você usa como o primeiro parâmetro como string, o segundo como int e o retorno com int.

 

Link para o comentário
Compartilhar em outros sites

Rafael, eu tentei usar a classe, mas simplesmente não funciona. Tentei inclusive extrair o carregamento e a chamada das funções da própria classe e também não funciona. Vou alterar as declarações, mas a princípio a própria documentação da ACBrLib informa que  tanto o retorno quanto o segundo parâmetro é um "Integer".

Com relação a tipagem dos parâmetros, os tipos não são do Harbour prorpiamente dito, mas sim do C. Vou usar o tipo "LPSTR" que é equivalente a um ponteiro para string em C para ver se funciona.

Link para o comentário
Compartilhar em outros sites

  • Solution

Consegui resolver. 

O problema em questão tem haver com as declarações mas não com os tipos propriamente ditos. Tanto na declaração quanto na chamada da função, é necessário informar que o argumento deve ser enviado como referência, simplesmente adicionando um "@" antes do nome do parâmetro, da seguinte forma:

DLL32 Function MAIL_UltimoRetorno(@vMsgRet AS STRING, @vTamBuf AS _INT) AS _INT PASCAL FROM "MAIL_UltimoRetorno" LIB xDllMail

 

Observação: Acredito que a classe disponibilizada nos fontes funcione somente para Harbour e não para xHarbour Comercial, se possível alguém poderia realizar este teste para verificar. Pois realmente tentei utilizá-la e sem modificar as chamadas das funções nada funciona.

Editado por sucsis
Adição de observação, pois a classe sugerida não funciona no xHarbour Comercial
Link para o comentário
Compartilhar em outros sites

×
×
  • 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.