Ir para conteúdo
  • Cadastre-se

dev botao

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


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

Recommended Posts

Postado

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

 

Postado

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.

 

Postado

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.

  • Solution
Postado (editado)

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

The popup will be closed in 10 segundos...
The popup will be closed in 10 segundos...