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