Página 1 de 2

Funcao hb_dyncall(....)

Enviado: 01 Jun 2017 19:17
por jjuliofcampos
Quais sao os parametros para essa funcao?
Como devo fazer para executar a funcao "envcomm(cSTRING) da dll pertochekser.dll que devera retornar TRUE ou FALSE.

TDLL:=hb_libLoad("PertoChekSer.dll" )
RET:=hb_dynCall({"EnvComm",TDLL,HB_DYN_CALLCONV_STDCALL },cCom)
Neste exemplo em meu prg está retornando variavel numerica, -2000 em vez de .t. ou .f.



jjulio

Funcao hb_dyncall(....)

Enviado: 01 Jun 2017 22:52
por JoséQuintas
Ao que parece, está fazendo errado.
Só pesquisar exemplos no Harbour.
dyncall.png

Funcao hb_dyncall(....)

Enviado: 02 Jun 2017 19:41
por jjuliofcampos
Realmente não estou sabendo quais parâmetros usar para obter o retorno da função EnvComm que será executada pelo hb_dyncall(...) que deveria ser FALSE ou TRUE.
RET:=hb_dynCall({"EnvComm",TDLL,HB_DYN_CALLCONV_STDCALL },cCom)
A variavel REC recebera a informação de que a função hb_dyncall(..) foi executada sem erro ou não ;
O resultado da função EnvComm executada dentro do hb_dyncall () devera ser .t. ou .f.
Suponho que deva passar um parametro informando a variavel que vai receber esse retorno.
Não sei se estou sendo claro mas, resumindo, preciso receber o retorno da função EnvComm, isto é, FALSE ou TRUE.


jjulio

Funcao hb_dyncall(....)

Enviado: 02 Jun 2017 22:13
por JoséQuintas
Desculpe, eu me confundi com o array, e achei que sua sintaxe estava errada.
À primeira vista, está tudo certo quanto ao modo de usar.

Por acaso esse -2000 não pode se referir a algum código de erro?

O parâmetro é caractere ou é pointer de caractere?
Se for pointer de caractere, é @cCom ao invés de cCom.

Funcao hb_dyncall(....)

Enviado: 03 Jun 2017 08:29
por Jairo Maia
Olá Pessoal,
jjuliofcampos escreveu:O resultado da função EnvComm executada dentro do hb_dyncall () devera ser .t. ou .f.
O retorno da hb_dynCall() sempre será numérico, nunca lógico. O problema é realmente encontrar documentação dessa função. Não se acha nem nos grupos do Harbour.

Funcao hb_dyncall(....)

Enviado: 03 Jun 2017 19:17
por jjuliofcampos
O parametro que estou passando é uma string "$4000000001234500"
Creio que preciso acrescentar um parametro para receber uma variavel logica como resposta da funcao EnvComm...
-2000 deve ser erro na execução do hb_dyncall....
Essa dll que estou testando pede uma impressora serial em COM1:; Acho que devo fazer o teste com uma DLL mais simples, sem envolver meios fisicos, e que deva retornar um variavel logica.
Alguma sugestao de DLL?


jjulio

Funcao hb_dyncall(....)

Enviado: 04 Jun 2017 11:22
por JoséQuintas
O retorno da hb_dynCall() sempre será numérico, nunca lógico. O problema é realmente encontrar documentação dessa função. Não se acha nem nos grupos do Harbour.
O retorno depende da DLL, e geralmente é um tipo em C que é convertido pra Harbour.
.T. ou .F. pode ser 0 ou 1, ou algo parecido.

GetParent, que está em user32.dll

Código: Selecionar todos

   hWndParent := hb_DynCall( { "GetParent", "user32.dll", HB_DYN_CALLCONV_STDCALL }, hWnd )
Ela recebe um parâmetro num formato, e devolve outro parâmetro, por coincidência no mesmo formato.

GetModuleFileNameA, em kernel32.dll

Código: Selecionar todos

LOCAL cFileName := Space(100), nSize := 100
hb_DynCall( { "GetModuleFileNameA", "kernel32.dll", HB_DYN_CALLCONV_STDCALL }, , @cFileName, nSize )
Ela recebe o "pointer" da string aonde vai armazenar o nome do EXE.
O pointer é algo como um endereço de memória.
Se não passar como pointer, ou não couber o nome do EXE nesse espaço de variável, é GPF, porque o resultado pode invadir o espaço de outra variável.
Até por isso existe a HBWIN, que tem funções intermediárias pra API do Windows já com algum tpo de conversão, pra evitar GPF.

Isso tudo não é hb_DynCall() que decide, é a função dentro da DLL.
O máximo que pode acontecer, é converter o resultado para algum tipo conhecido pelo Harbour.

Cada função de cada DLL tem suas exigências/parâmetros/retornos, e cabe ao desenvolvedor da DLL apresentar um manual de uso.

Se a função em questão retorna -2000, isso está longe de ser .T. ou .F.
Não precisa manual da hb_DynCall, precisa manual da DLL.

Funcao hb_dyncall(....)

Enviado: 06 Jun 2017 18:41
por jjuliofcampos
A funcao que estou tentando executar atraves da hb_dyncall(...) é EnvComm( string ) onde a string é um comando para a impressora nao fiscal executar pela COM1:
O retorno dessa funcao é .t. ou .f. que vai me dizer se a impressora recebeu o comando...
Creio que em hb_dyncall() falta uma variavel como parâmetro para eu poder receber o regtorno de EnvComm()...

jjulio

Funcao hb_dyncall(....)

Enviado: 06 Jun 2017 19:19
por JoséQuintas
Se a função tem mais parâmetros, então precisa do manual da DLL pra ver que parâmetro é esse.

Funcao hb_dyncall(....)

Enviado: 06 Jun 2017 20:43
por JoséQuintas
Fiz uma pesquisa no google.

Achei o kit de desenvolvimento dessa DLL

Tem tudo lá, menos alguma função que retorne .T. ou .F.

Não sei se tem algum manual, mas provavelmente não é dessa DLL.

Só pesquisar no google, ou ir direto no site do fabricante.
.

Funcao hb_dyncall(....)

Enviado: 07 Jun 2017 16:12
por jjuliofcampos
Esta rotina em C é um exemplo de uso das funções de pertoChekser.DLL
IniComm()
EnvComm()
RetComm()
EndComm()
SerialBusy()
Consta no kit de desenvolvimento da PertoChek (PertoChek\A0035K01-KitPertoChek\SERIAL\Win32)


/* Declarações: */
char chCmd[2048], chAnswer[2048];
int nRet;

/*** Inicialização da porta ***/
nRet = IniComm("COM1:4800, N, 8, 1");

if (nRet! = FALSE)
/* A porta foi inicializada com sucesso! */
else
/* Ocorreu um erro na inicialização da porta...*/


/*** Rotina para enviar comandos e receber a resposta da PertoChek ***/
/* Limpa buffer: */
memset(chAnswer, '\0', sizeof(chAnswer));

/* Comando a ser enviado: Preenchimento de cheque */
strcpy(chCmd, “$4000000123456000”);

/* Verifica se a PertoChek não está ocupada. */
if (SerialBusy(5) == FALSE)
{
/* A PertoChek encontra-se ocupada! */
}

/* Transmite o comando: */
nRet = EnvComm(chCmd);

if (nRet != FALSE)
{
/* Recebe resposta da pertochek: */
nRet = RecComm(50, chAnswer);
if (nRet == FALSE)
/* Ocorreu time out: a PertoChek não respondeu ao comando!! */
}
else
{
/* O comando não pode ser enviado. */
/* Erro: O camando não pode ser enviado!! */

return;
}

/*** Finaliza a porta***/
EndComm();

Funcao hb_dyncall(....)

Enviado: 07 Jun 2017 20:46
por JoséQuintas
Acho C muito complicado, parece coisa de maluco, prefiro exemplo em VB.
Do mesmo kit de desenvolvimento.
pertochek.png

Funcao hb_dyncall(....)

Enviado: 07 Jun 2017 21:15
por JoséQuintas
Esquisito....
Este é o único fonte em C que tem na pasta.
Se entendi, o retorno é sempre numérico.
pertochek2.png

Sei lá de onde veio seu fonte....

De qualquer forma, mostra que falta o SerialBusy() e IniComm2() no VB6.

Eita empresinha ruim de software., exemplo incompleto pra VB.

Funcao hb_dyncall(....)

Enviado: 07 Jun 2017 21:28
por JoséQuintas
Baixei daqui.
perto.png

Funcao hb_dyncall(....)

Enviado: 07 Jun 2017 21:36
por JoséQuintas
E o único que trata pertochek.dll é este.
Inclusive no download consta o tal A0035K01.
perto2.png
Agora fiquei curioso pra saber de onde veio o seu fonte.