Página 1 de 1
Consigo usar uma DLL ?
Enviado: 10 Jun 2014 08:52
por Maurício Elias
Olá, bom dia.
Eu preciso preparar meu Sistema para imprimir cheques em uma impressora de Cheques Bema DP-20. Ela tem um driver para Dos, de 1999. Mas tem tb uma DLL.
Eu consigo compilar essa DLL com o HB32 modo Console?
Caso afirmativo, a partir dai é só udar os comandos cfe o manual ?
Grato...
Consigo usar uma DLL ?
Enviado: 10 Jun 2014 09:47
por Itamar M. Lins Jr.
Ola!
Exemplo da pasta /contrib/hbxpp
Código: Selecionar todos
/* Copyright 2008 Viktor Szakats (vszakats.net/harbour) */
/* DLL call demonstration. */
#require "hbxpp"
#include "simpleio.ch"
#include "dll.ch"
#define MAX_PATH 260
#define MB_OK 0x00000000
#define MB_OKCANCEL 0x00000001
#define MB_ABORTRETRYIGNORE 0x00000002
#define MB_YESNOCANCEL 0x00000003
#define MB_YESNO 0x00000004
#define MB_RETRYCANCEL 0x00000005
#define MB_CANCELTRYCONTINUE 0x00000006
#define MB_ICONHAND 0x00000010
#define MB_ICONQUESTION 0x00000020
#define MB_ICONEXCLAMATION 0x00000030
#define MB_ICONASTERISK 0x00000040
#define MB_USERICON 0x00000080
#define MB_DEFBUTTON2 0x00000100
#define MB_DEFBUTTON3 0x00000200
#define MB_DEFBUTTON4 0x00000300
#define MB_SYSTEMMODAL 0x00001000
#define MB_TASKMODAL 0x00002000
#define MB_HELP 0x00004000
#define MB_NOFOCUS 0x00008000
#define MB_SETFOREGROUND 0x00010000
#define MB_DEFAULT_DESKTOP_ONLY 0x00020000
#define MB_TOPMOST 0x00040000
#define MB_RIGHT 0x00080000
#define MB_RTLREADING 0x00100000
#define SPI_SETDRAGFULLWINDOWS 37
#define CSIDL_APPDATA 0x001a /* <username>\Application Data */
#define CSIDL_ADMINTOOLS 0x0030 /* <username>\Start Menu\Programs\Administrative Tools */
PROCEDURE Main()
LOCAL hDLL
LOCAL cData
#if defined( __PLATFORM__WINDOWS )
IF hb_FileExists( "pscript.dll" )
hDLL := DllLoad( "pscript.dll" )
cData := Space( 24 )
DllCall( hDll, DLL_OSAPI, "PSGetVersion", @cData )
? ">" + cData + "<"
DllUnload( hDLL )
// Testing failure 1
hDLL := DllLoad( "pscript.dll" )
cData := Space( 24 )
DllCall( hDll, DLL_OSAPI, "PSGet__Version", @cData )
? ">" + cData + "<"
DllUnload( hDLL )
ENDIF
// Testing failure 2
hDLL := DllLoad( "nothere.dll" )
cData := Space( 24 )
DllCall( hDll, NIL, "PSGetVersion", @cData )
? cData
DllUnload( hDLL )
? "MsgBox:", DllCall( "user32.dll", DLL_OSAPI, "MessageBoxA", 0, "Hello world!", "Harbour sez", hb_bitOr( MB_OKCANCEL, MB_ICONEXCLAMATION, MB_HELP ) )
/* Force Windows not to show dragged windows contents */
? "Full content drag: OFF"
? DllCall( "user32.dll", DLL_OSAPI, "SystemParametersInfoA", SPI_SETDRAGFULLWINDOWS, 0, 0, 0 )
Inkey( 0 )
? "Full content drag: ON"
? DllCall( "user32.dll", DLL_OSAPI, "SystemParametersInfoA", SPI_SETDRAGFULLWINDOWS, 1, 0, 0 )
Inkey( 0 )
? "DLLCALL"
cData := Space( MAX_PATH )
? DllCall( "shell32.dll", DLL_OSAPI, "SHGetFolderPathA", 0, CSIDL_ADMINTOOLS, 0, 0, @cData )
? "REF:", cData
? "DLLCALL"
cData := Space( MAX_PATH )
? DllCall( "shell32.dll", DLL_OSAPI, "SHGetFolderPathW", 0, CSIDL_ADMINTOOLS, 0, 0, @cData )
? "REF:", cData
#endif
RETURN
Saudações,
Itamar M. Lins Jr.
Consigo usar uma DLL ?
Enviado: 11 Jun 2014 09:12
por Maurício Elias
Olá, bom dia. Obrigado Itamar.
Poderiam me dar mais orientações, p.favor?
Preciso usar uma impressora de Cheques da bema, Driver: BEMADP32.DLL
Se bem entendi, ficaria assim:
#include "dll.ch"
PROCEDURE Main()
LOCAL hDLL
hDLL := DllLoad( "BEMADP32.DLL" )
DllCall( hDLL, NIL , Bematech_DP_IniciaPorta("COM1") ) // Abrindo a COM1
DllUnload( hDLL )
Tá certo isso

São necessários todos aqueles Define, Include e Require ?
Obrigado.....
Consigo usar uma DLL ?
Enviado: 11 Jun 2014 09:51
por Itamar M. Lins Jr.
Ola!
Teste ai primeiro, pergunta depois. Se der erro mostre o erro e a linha de código.
Saudações,
Itamar M. Lins Jr.
Consigo usar uma DLL ?
Enviado: 11 Jun 2014 15:38
por Toledo
Mauricio, compile este exemplo e veja se vai dar certo.
Arquivo:
bema_dp.prg
Código: Selecionar todos
/**********************************
* Compilar: hbmk2 bema_dp.prg -lhbwin
**********************************/
#include "hbdyn.ch"
FUNCTION MAIN()
CLS
SetMode(25,80)
hDLL:=HB_LibLoad("BEMADP32.dll")
cPorta:="COM1"
ret:=HB_dynCall({"Bematech_DP_IniciaPorta", hDLL,HB_DYN_CALLCONV_STDCALL},cPorta)
if ret!=0
alert("Porta Inicializada com sucesso!")
cBanco:= '001'
cValor:= '1250,00'
cFavorecido:= 'Mauricio Elias'
cCidade:= 'Sao Paulo'
cData:= '11/06/2014'
cMsg:= 'Bom para 15/07/2014'
ret:=HB_dynCall({"Bematech_DP_ImprimeCheque", hDLL,HB_DYN_CALLCONV_STDCALL},cBanco,cValor,cFavorecido,cCidade,cData,cMsg)
if ret>0
ALERT("Cheque impresso com sucesso!")
else
if ret==0
ALERT("Erro de comunicacao com a impressora")
elseif ret==-2
ALERT("Parametro invalido")
else
ALERT("Banco nao localizado")
endif
endif
ret:=HB_dynCall({"Bematech_DP_FechaPorta", hDLL,HB_DYN_CALLCONV_STDCALL})
if ret!=0
alert("Porta finalizada")
else
alert("Erro ao tentar fechar a porta "+cPorta)
endif
else
alert("Erro ao Inicializar a Porta "+cPorta)
endif
HB_LibFree(hDLL)
RETURN Nil
Eu não testei, pois não tenho esta impressora aqui, mas acho que vai funcionar.
Abraços,
Consigo usar uma DLL ?
Enviado: 11 Jun 2014 16:59
por Maurício Elias
Olá, boa tarde pessoal.
Desculpem a euforia...
Compilei o primeiro exemplo acima, mas não deu certo por enquanto... vou tentando!
Toledo, o seu compilou na primeira, mas deu a mensagem, na execução:
"Erro ao Inicializar a Porta COM1"
Passei prá COM2, mas tb deu o erro.
Não conseguiu abrir a porta né !!!
O BEMADP32.DLL e BEMADP32.INI estão na pasta do Sistema mesmo.
Estou com uma impressora aq novinha prá testes, mas logo vai embora...
Pouco tempo mata a gente né rs... Que faço agora

Abraços amigos............
Consigo usar uma DLL ?
Enviado: 12 Jun 2014 05:23
por Jairo Maia
Olá Maurício,
Maurício Elias escreveu:Toledo, o seu compilou na primeira, mas deu a mensagem, na execução:
"Erro ao Inicializar a Porta COM1"
Passei prá COM2, mas tb deu o erro.
Maurício, verifique qual é o problema nas suas portas COM. No tocante a abertura da porta o exemplo está corretissimo. Se não abriu a porta o problema é outro.
Consigo usar uma DLL ?
Enviado: 12 Jun 2014 12:27
por Maurício Elias
Olá, bom dia.
Gente, que loucura isso...
O exemplo tá certo mesmo. Mas também acusa "Banco não Encontrado!". Percebi que a DLL não usa a .INI, que tem Bancos lá.
Usei o comando "Bematech_DP_TravaDocumento(1)" para travar ela antes de imprimir.
Ela responde ao Travamento e Destravamento, mas mesmo assim dá "Banco não Encontrado". Essa infeliz dessa impressora não tem, ou não encontra Bancos. No exemplo Delphi, da Bema, tb dá o mesmo problema.
Mesmo eu usando o comando de cadastrar bancos (Bematech_DP_ProgramaBanco()).
Alguém sabe aonde se esconde esse cadastro de bancos ?
Grato pessoal...
Consigo usar uma DLL ?
Enviado: 12 Jun 2014 14:55
por Maurício Elias
rsrs solução do suporte Bema:
A BemaDP32.INI deve estar na pasta C:\Windows para os bancos serem lidos. É mole. Claro que não consta no help isso, né.
Brigadão a todos pela grande força. Agora uso DLL, é muito legal...