Dll nao carrega
Moderador: Moderadores
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
Dll nao carrega
Ola!
O ACBr, eu já baixo do SVN e compilo, instalo os pacotes no Lazarus.
Pelo que tenho entendido, essa restrição é para quem não usa Lazarus. Quem usa Lazarus/Delphi não precisa de DLL nem do Monitor, isso é só para as outras linguagens.
Fora um suporte específico, algum eventual problema, para quem usa Delphi/Lazarus precisara pagar se assim desejar.
Saudações,
Itamar M. Lins Jr.
O ACBr, eu já baixo do SVN e compilo, instalo os pacotes no Lazarus.
Pelo que tenho entendido, essa restrição é para quem não usa Lazarus. Quem usa Lazarus/Delphi não precisa de DLL nem do Monitor, isso é só para as outras linguagens.
Fora um suporte específico, algum eventual problema, para quem usa Delphi/Lazarus precisara pagar se assim desejar.
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
Dll nao carrega
Resolvi usando as funções que vc indicou hb_DynCall(). Obrigado.JoséQuintas escreveu:qu
Valeu Rubens, só não entendo como é que vocês usam a DllCall() se essa função não existe, dá erro, vocês usam alguma lib de terceiros? Como o Zeh disse, estou usando a hb_DynCall().rubens escreveu:Bom dia...
Nilton.. é meio chatinho mesmo, até pegar o jeito...
Para ler um iniPara imprimir Danfe ou gerar o pdfCódigo: Selecionar todos
// ACbrNfe.dll #define DC_CALL_STD 0x0020 // __stdcall #define DLL_OSAPI DC_CALL_STD #define STR_LEN 256 #define ACBrLIB "ACBrNFe32.dll" FUNCTION LerIni_acbr(cSecao, cChave, cFile) LOCAL GetList := {} Local cTexto := '' Local cBufferlen Local hLib Local iRetorno If ! File( cFile ) Return '' EndIf hLib := DllLoad( ACBrLIB ) iRet := DllCall( hLib, DLL_OSAPI, "NFE_Inicializar", "", "") bufferLen:= STR_LEN cTexto := Space(bufferLen) iRet := DllCall( hLib, DLL_OSAPI,"NFE_ConfigLer", cFile ) iRet := DllCall( hLib, DLL_OSAPI,"NFE_ConfigLerValor", hb_StrToUTF8(cSecao), hb_StrToUTF8(cChave), @cTexto, @bufferLen ) iRet := DllCall( hLib, DLL_OSAPI,"NFE_Finalizar") hLib := NIL If iRet = 0 // Gambiarra até saber como usa stran para retirar o ultimo caracter cTexto := Left( cTexto, Len(Alltrim(cTexto)) -1 ) Else cTexto := '' EndIF RETURN cTextoDetalhes.. você tem que carregar o xml, depois é só mandar gerar o PDF ou imprimir. Depois que carregar o xml não precisa mais fazer referência a ele. É muito rápido e dinâmico.. porque não precisa alterar o layout.. é só baixar a última versão que todas as mudanças necessárias já estão prontas.Código: Selecionar todos
FUNCTION ImprimirPDFNfe(cArq, lPdf) LOCAL cTela := SaveScreen() LOCAL GetList := {} Local cTexto := '' Local cBufferlen Local hLib hLib := DllLoad(ACBrLIB) iRet := DllCall(hLib, DLL_OSAPI, "NFE_Inicializar", "", "") bufferLen:= STR_LEN cTexto := Space(bufferLen) iRet := DllCall(hLib, DLL_OSAPI, "NFE_CarregarXML", hb_StrToUTF8(cArq)) If lPdf iRet := DllCall(hLib, DLL_OSAPI, "NFE_ImprimirPDF") Else iRet := DllCall(hLib, DLL_OSAPI,"NFE_Imprimir", hb_StrToUTF8(""), 1, hb_StrToUTF8(""), hb_StrToUTF8("True"), hb_StrToUTF8(""), hb_StrToUTF8(''), hb_StrToUTF8("")) EndIf iRet := DllCall( hLib, DLL_OSAPI,"NFE_Finalizar") hLib := NIL RETURN nil
o PDF será gerado na path configurado no acbrlib.ini
tem que ter todas estas libs na pasta do executável. Agora que você que manja bem de classe... pode dar uma olhada no acbrnfedemo do projeto... tem classe para a nfe pronta e até para boleto.
A maioria dos comandos do acbrmonitor estão no acbrnfedemo..
Isso compilo com Hb32
Att..
Rubens
Grato.
Itamar, eu tbm atualizalo a pasta ACBr pelo SVN mas até hoje não consegui compilar o ACBrMonitor pelo Lazarento e nem faço ideia como eles geram as DLL's do ACBrLib... Então este mês eu fiz assinatura no Forum, se precisarem de algo atualizado é só me falar até vcs fazerem a assinatura tbm. Fui ajudado no inicio até eu poder deixar de pagar empresas de terceiros e poder assinar. Faz uns 30 dias que comecei usar o ACBrMonitorPlus para autorização de CTe, agora estou testando as DLLs para ter mais controle das repostas de retornos, pois pelo ACBrMonitor vc não tem um bom controle. Fiquei sabendo que estão criando classes de alto nível para PHP do ACBrLib como já existe para o Delphi.Itamar M. Lins Jr. escreveu:Ola!
O bat para compilar o ACBr.O erro acontece nessa linha!Código: Selecionar todos
@echo off setlocal EnableDelayedExpansion cls echo. echo. echo. Utilitario para baixar e compilar o ACBrMonitorPlus.exe echo. echo. Para Prosseguir Voce Precisara: echo. echo. - GIT INSTALADO echo. - SVN COM COMMAND LINE TOOLS echo. - LAZARUS INSTALADO NA PASTA PADRAO C:\LAZARUS echo. :init0 ( echo. choice /c SN /n /m "Podemos Continuar? [S/N]" if %errorlevel% EQU 1 goto :init1 if %errorlevel% EQU 2 goto :end ) :init1 ( set lazarus_home=c:\lazarus set path=%path%;%lazarus_home% echo. echo. choice /c SN /n /m "ATENCAO... Deseja fazer o checkout dos fontes (apaga e baixa)? [S/N]" if %errorlevel% EQU 1 goto :checkout if %errorlevel% EQU 2 goto :make ) :checkout ( if exist C:\FontesACBr ( rd /s /q C:\FontesACBr ) else ( echo Pasta C:\FontesACBr sera criada... ) md C:\FontesACBr git clone https://github.com/fortesinformatica/fortesreport-ce.git C:\FontesACBr\fortesreport-ce if %errorlevel% NEQ 0 goto :error svn co svn://svn.code.sf.net/p/acbr/code/trunk2 C:\FontesACBr if %errorlevel% NEQ 0 goto :error svn co svn://svn.code.sf.net/p/lazarus-ccr/svn/components/powerpdf C:\FontesACBr\powerpdf if %errorlevel% NEQ 0 goto :error ) :make ( rem Compila‡Æo Incremental (compila a fonte principal (Main Source) e as fontes com datas mais recentes) lazbuild.exe C:\FontesACBr\Projetos\ACBrMonitorPLUS\Lazarus\ACBrMonitor.lpi --verbose --bm=Release rem Compila‡Æo nÆo Incremental (Build All - compila todos os fontes) rem lazbuild.exe C:\FontesACBr\Projetos\ACBrMonitorPLUS\Lazarus\ACBrMonitor.lpi -B --verbose --bm=Release if %errorlevel% NEQ 0 goto :error ) echo. echo. OK... Sucesso... goto :end :error ( echo. echo. FALHOU... Houve Erro na Compilacao... goto :end ) :end
Pelo erro, basta editar a linha do bat e acrescentar, mas quem removeu isso ?Código: Selecionar todos
C:\devl\acbr>lazbuild.exe C:\devl\acbr\Projetos\ACBrMonitorPLUS\Lazarus\ACBrMonitor.lpi --verbose --bm=Release Parameter: bm=Release Hint: (lazarus) primary config path: C:\Users\Ricardo Mello\AppData\Local\lazarus Hint: (lazarus) [TBuildManager.SetBuildTarget] Old=x86_64-win64-win32 New=x86_64-win64-win32 Changed: OS/CPU=True LCL=False Erro: (lazarus) modo de construção inválido "Release" Modos de construção de projeto disponíveis: * Debug Release-Win32-i386 Release-Win64-x86_64 Release-Linux-x86_64 Release-Linux-i386
>lazbuild.exe C:\devl\acbr\Projetos\ACBrMonitorPLUS\Lazarus\ACBrMonitor.lpi --verbose --bm=Release
Para:
>lazbuild.exe C:\devl\acbr\Projetos\ACBrMonitorPLUS\Lazarus\ACBrMonitor.lpi --verbose --bm=Release-win64-x86_64
Mas isso tudo só vai funcionar "SE" você compilar e incorporar na IDE do Lazarus, os chamados pacotes do ACBr.Saudações,Código: Selecionar todos
C:\devl\acbr>lazbuild.exe C:\devl\acbr\Projetos\ACBrMonitorPLUS\Lazarus\ACBrMonitor.lpi --verbose --bm=Release-win64-x86_64 Parameter: bm=Release-win64-x86_64 Hint: (lazarus) primary config path: C:\Users\Ricardo Mello\AppData\Local\lazarus Hint: (lazarus) [TBuildManager.SetBuildTarget] Old=x86_64-win64-win32 New=x86_64-win64-win32 Changed: OS/CPU=True LCL=False Hint: (lazarus) [TBuildManager.SetBuildTarget] Old=x86_64-win64-win32 New=x86_64-win64-win32 Changed: OS/CPU=True LCL=False Hint: (lazarus) package FCL 1.0.1 was compiled via "make" with parameters " -Fu. -MObjFPC -Scghi -O1 -g -gl -l -vewnhibq fcllaz.pas" Hint: (lazarus) package LazUtils 1.0 was compiled via "make" with parameters " -Fu..\..\packager\units\x86_64-win64;. -MObjFPC -Scghi -O1 -g -gl -l -vewnhibq lazutils.pas" Hint: (lazarus) package LCLBase 2.0.8 was compiled via "make" with parameters " -MObjFPC -Scghi -O1 -g -gl -vew -l -Fuforms;widgetset;;..\packager\units\x86_64-win64;..\components\lazutils\lib\x86_64-win64;. -Fiinclude alllclunits.pp" Hint: (lazarus) package LCL 2.0.8 was compiled via "make" with parameters " -MObjFPC -Scghi -O1 -g -gl -vewnhi -l -Fuwin32;..\..\packager\units\x86_64-win64;..\..\components\lazutils\lib\x86_64-win64;..\units\x86_64-win64;. -Fiwin32 lcl.pas" Hint: (lazarus) package cairocanvas_pkg 0.0 was compiled via "make" with parameters " -Fu..\..\packager\units\x86_64-win64;..\lazutils\lib\x86_64-win64;..\..\lcl\units\x86_64-win64;..\..\lcl\units\x86_64-win64\win32;. -MObjFPC -Scghi -O1 -g -gl -l -vewnhibq -dLCL -dLCLwin32 cairocanvas_pkg.pas" Hint: (lazarus) package LazControls 1.0.1 was compiled via "make" with parameters " -Fu..\..\packager\units\x86_64-win64;..\lazutils\lib\x86_64-win64;..\..\lcl\units\x86_64-win64;..\..\lcl\units\x86_64-win64\win32;. -MObjFPC -Scghi -O1 -g -gl -l -vewnhibq -dLCL -dLCLwin32 lazcontrols.pas"
Itamar M. Lins Jr.
Nilton Medeiros
nilton@sistrom.com.br
nilton@sistrom.com.br
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
Dll nao carrega
Ola!
O certificado de 1 ano é melhor e mais rápido.
Coisas do Brasil, o certificado mais caro é pior.
Eu acredito que é super válido pagar o suporte. Mas é suporte! Ninguém tem obrigação de ensinar nada de graça, ainda mais uma coisa tão técnica que é essa área.
Mas colocar uma coisa que não funciona, ou incompleta e apontar caminho como direção a seguir é que sou contra. Tem, tem, não tem não tem. Para as pessoas aqui do forum não ficar de mi,mi... só postei pq tem várias questões de como usar PASCAL com Harbour.
Se vc usa Lazarus, tá tudo lá é só clicar e instalar(leia o manual, assista aos vídeos, siga algum roteiro), para outras linguagens não.
Saudações,
Itamar M. Lins Jr.
Quando usamos o certificado de 3 anos ou pendrive, cartão é muito mais lento.ACBrMonitor vc não tem um bom controle
O certificado de 1 ano é melhor e mais rápido.
Coisas do Brasil, o certificado mais caro é pior.
Eu acredito que é super válido pagar o suporte. Mas é suporte! Ninguém tem obrigação de ensinar nada de graça, ainda mais uma coisa tão técnica que é essa área.
Mas colocar uma coisa que não funciona, ou incompleta e apontar caminho como direção a seguir é que sou contra. Tem, tem, não tem não tem. Para as pessoas aqui do forum não ficar de mi,mi... só postei pq tem várias questões de como usar PASCAL com Harbour.
Se vc usa Lazarus, tá tudo lá é só clicar e instalar(leia o manual, assista aos vídeos, siga algum roteiro), para outras linguagens não.
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
Dll nao carrega
Ola!
Antes de rodar o BAT tem que adicionar o PACOTES do ACBr ao Lazarus.
O Bat é um arquivo que vem e está no SVN. BuildAcrb.Bat
E no SVN tem um PDF, Bem_Vindo_ao_Trunk2.pdf que ensina como adicionar os pacotes do ACBr ao Lazarus. Quem usa o BAT e o programa acbrmonitor_etc.exe são ferramentas de terceiros. Repetindo para o Lazarus não é necessário.
Ai que está o problema, pq não funciona, embora tenha como roteiro a seguir, quem vê pela primeira vez fica sem entender.
Saudações,
Itamar M. Lins Jr.
Antes de rodar o BAT tem que adicionar o PACOTES do ACBr ao Lazarus.
O Bat é um arquivo que vem e está no SVN. BuildAcrb.Bat
E no SVN tem um PDF, Bem_Vindo_ao_Trunk2.pdf que ensina como adicionar os pacotes do ACBr ao Lazarus. Quem usa o BAT e o programa acbrmonitor_etc.exe são ferramentas de terceiros. Repetindo para o Lazarus não é necessário.
Ai que está o problema, pq não funciona, embora tenha como roteiro a seguir, quem vê pela primeira vez fica sem entender.
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
- rubens
- Colaborador

- Mensagens: 1520
- Registrado em: 16 Ago 2003 09:05
- Localização: Nova Xavantina - MT
Dll nao carrega
Boa noite..
Eu tentei com hb_DynCall() mas não carregou a lib. Provavelmente algum erro meu...
Att..
Rubens
NIlton... assim de bate pronto, acho que a dllcall() é do xharbour daí tem que compilar com -lxhb. Acho que todos as funções do xharbour se compilar com -lxhb funcionam no harbour... se eu estiver errado alguem vai me corrigir..Valeu Rubens, só não entendo como é que vocês usam a DllCall() se essa função não existe, dá erro, vocês usam alguma lib de terceiros? Como o Zeh disse, estou usando a hb_DynCall().
Grato.
Eu tentei com hb_DynCall() mas não carregou a lib. Provavelmente algum erro meu...
Att..
Rubens
"Eu e minha casa servimos ao Senhor e você
"
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
Dll nao carrega
Ola!
Tem correção no SVN do ACBr, para o pessoal do Harbour.
Itamar M. Lins Jr.
Tem correção no SVN do ACBr, para o pessoal do Harbour.
Saudações,[-] Corrigido erro no destroy das classes em [x]Harbour, passando a utilizar dll em Cdecl em vez de StdCall.
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Dll nao carrega
Só fugindo um pouco do assunto.... e pra fazer pensar:
Se dá pra usar DLL do Delphi no Harbour.... o que impediria de usar uma biblioteca gráfica do Delphi no Harbour?
E tem Delphi pra Windows e Linux e outros....
Se dá pra usar DLL do Delphi no Harbour.... o que impediria de usar uma biblioteca gráfica do Delphi no Harbour?
E tem Delphi pra Windows e Linux e outros....
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
Dll nao carrega
Ola!
Lazarus usa GTK, a Hwgui também. Tem GTK para Windows ? tem, o GTK é nativo em qual plataforma ? reposta Linux...
O problema é: Qual é o tamanho da comunidade que vc tem na sua linguagem para te guiar ?
E o Harbour com cada vez menos pessoas...
Ps. A propósito consegui criar a LIB do ACBr, aqui para 32bits... ainda estudando e aprendendo...(Jonatan Gaivota)
Saudações,
Itamar M. Lins Jr.
Nada impede, apenas que isso tudo já existe. É só descobrir como andar neste emaranhado de informações.usar uma biblioteca gráfica do Delphi no Harbour
Lazarus usa GTK, a Hwgui também. Tem GTK para Windows ? tem, o GTK é nativo em qual plataforma ? reposta Linux...
O problema é: Qual é o tamanho da comunidade que vc tem na sua linguagem para te guiar ?
E o Harbour com cada vez menos pessoas...
Ps. A propósito consegui criar a LIB do ACBr, aqui para 32bits... ainda estudando e aprendendo...(Jonatan Gaivota)
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
Dll nao carrega
Vídeo mostrando como instalar ACBr no Lazarus, é do canal InfoCotidiano do Daniel, o cara é muito gente boa, ajuda muito o pessoal e tem muitos vídeos bacanas ensinando Lazarus, Linux, Delphi, SQL, etc, vale muito a pena se inscrever no canal dele !
Marcelo Neves
https://produto.mercadolivre.com.br/MLB ... 0067609615
whatsapp (41) 99786-3995
http://harbourdeveloper.blogspot.com
marcelo.souza.das.neves@gmail.com
https://produto.mercadolivre.com.br/MLB ... 0067609615
whatsapp (41) 99786-3995
http://harbourdeveloper.blogspot.com
marcelo.souza.das.neves@gmail.com
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
Dll nao carrega
Ola!
Pois é, assisti esse e até um lá do forum do ACBr, um com Lazarus versão velha... tem que buscar a informação.
Vc tinha postado na outra sessão, assisti e outras buscas acessando foruns, pesquisando se tem a informação blz. Se não achar pelo menos não fico pensando que não fiz a minha parte.
Saudações,
Itamar M. Lins Jr.
Pois é, assisti esse e até um lá do forum do ACBr, um com Lazarus versão velha... tem que buscar a informação.
Vc tinha postado na outra sessão, assisti e outras buscas acessando foruns, pesquisando se tem a informação blz. Se não achar pelo menos não fico pensando que não fiz a minha parte.
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
Dll nao carrega
Zeh, só para deixar registrado, as funções DllLoad(), DllCall() e DllUnload() existem sim e estão na lib hbxpp (libhbxpp.a), é só colocar essa lib para compilar. De qualquer forma achei melhor manter as funções hb_libLoad(), hb_DynCall() e hb_LibFree() respectivamente, essas estão funcionando perfeitamente.
#include "simpleio.ch"
#include "hmg.ch"
#include 'error.ch'
#include "hbdyn.ch"
Verifica se vc não esqueceu da hbdyn.ch
Depois vc em q carregar a dll:
Aí vc pode usar as funções da DLL:
Abraços.
Rubens, no teste que fiz, eu inclui estas:rubens escreveu:DynCall() mas não carregou a lib. Provavelmente al
#include "simpleio.ch"
#include "hmg.ch"
#include 'error.ch'
#include "hbdyn.ch"
Verifica se vc não esqueceu da hbdyn.ch
Depois vc em q carregar a dll:
Código: Selecionar todos
hDll := hb_libLoad(ACBrLIB)Código: Selecionar todos
h := hb_DynCall({"CTE_Inicializar", hDll, HB_DYN_CALLCONV_STDCALL}, "", "")Código: Selecionar todos
lenBuffer := 256
buffer := Space(lenBuffer)
hb_DynCall({"CTE_UltimoRetorno", @buffer, @lenBuffer})
if (lenBuffer > 256)
buffer := Space(lenBuffer)
hb_DynCall({"CTE_UltimoRetorno", @buffer, @lenBuffer})
endif
oError := ErrorNew()
oError:Severity := ES_ERROR
oError:Description := hb_UTF8ToStr(buffer)
ThRow(oError)
Nilton Medeiros
nilton@sistrom.com.br
nilton@sistrom.com.br
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
Dll nao carrega
Ola!
Justiça seja feita.
O pessoal só porque paga o SAC do ACBr, descasca lá...
Li uns posts de uma pessoa do VB, que não acertou usar a DLL, analiso a paciência do pessoal ensinando.
A mesma discussão que já ocorreu aqui, pq a pessoa acha que não é erro dela, pq acredita que o CPU dela é exclusivo.
Pq não seguiu o roteiro a risca e obteve outro resultado, quer desmotivar toda uma equipe.
Imagine quando não tem SAC é por questões de ajudar pura e simples, como é o caso desse forum.
Saudações,
Itamar M. Lins Jr.
Justiça seja feita.
O pessoal só porque paga o SAC do ACBr, descasca lá...
Li uns posts de uma pessoa do VB, que não acertou usar a DLL, analiso a paciência do pessoal ensinando.
A mesma discussão que já ocorreu aqui, pq a pessoa acha que não é erro dela, pq acredita que o CPU dela é exclusivo.
Pq não seguiu o roteiro a risca e obteve outro resultado, quer desmotivar toda uma equipe.
Imagine quando não tem SAC é por questões de ajudar pura e simples, como é o caso desse forum.
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
Dll nao carrega
Ola!
Explicando:
Essas são funções de compatibilidade com o xBase++ que tem na pasta contrib do Harbour
Vai ver que na realidade elas chamam hb_libLoad(), hb_DynCall() e hb_LibFree().
Não sei pq usaram essa de compatibilidade com o xBase++
Quer dizer se algum guru do Harbour corrigir a hb_libLoad, vá perder lá na contrib xBase++ ou recompilar etc...
Saudações,
Itamar M. Lins Jr.
Explicando:
Essas são funções de compatibilidade com o xBase++ que tem na pasta contrib do Harbour
Se olhar no fonte da pasta contrib do \contrib\hbxpp\dllx.cas funções DllLoad(), DllCall() e DllUnload() existem sim e estão na lib hbxpp (libhbxpp.a)
Código: Selecionar todos
/*
* Dynamic library handling functions (Xbase++ compatible)
*
...etc
/* NOTE: In Harbour this function will return an in-memory object, not a string.
2nd and 3rd parameters are not supported in Harbour. */
HB_FUNC_TRANSLATE( DLLLOAD, HB_LIBLOAD )
HB_FUNC_TRANSLATE( DLLUNLOAD, HB_LIBFREE )
/* NOTE: Function ordinals are not supported in 3rd parameter. */
HB_FUNC( DLLCALL )
{
PHB_ITEM pLibrary = hb_param( 1, HB_IT_ANY );
PHB_ITEM pLibraryHandle = NULL;
HB_BOOL bFreeLibrary = HB_FALSE;
if( pLibrary )
{
if( HB_IS_STRING( pLibrary ) )
{
pLibraryHandle = hb_libLoad( pLibrary, NULL );
...etc
Não sei pq usaram essa de compatibilidade com o xBase++
Quer dizer se algum guru do Harbour corrigir a hb_libLoad, vá perder lá na contrib xBase++ ou recompilar etc...
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
Dll nao carrega
Aproveitando para dar uma notícia para quem está com dificuldade de compilar o Lazarus para compilar a ACBrLib, assista estes vídeos:
Windows: https://www.youtube.com/watch?v=GSZOCmX ... e=emb_logo
Linux: https://www.youtube.com/watch?time_cont ... e=emb_logo
Windows: https://www.youtube.com/watch?v=GSZOCmX ... e=emb_logo
Linux: https://www.youtube.com/watch?time_cont ... e=emb_logo
Nilton Medeiros
nilton@sistrom.com.br
nilton@sistrom.com.br
- oribeiro
- Usuário Nível 1

- Mensagens: 30
- Registrado em: 15 Fev 2013 07:35
- Localização: Itu/SP
- Contato:
Dll nao carrega
Pessoal,
Fiz um procedimento simples aqui com xHarbour mas não estou tendo nenhuma resposta.
nfe:=ACBrNFe():New()
? nfe:StatusServico()
Estou usando a classe ACBrLib.Prg
Fiz um procedimento simples aqui com xHarbour mas não estou tendo nenhuma resposta.
nfe:=ACBrNFe():New()
? nfe:StatusServico()
Estou usando a classe ACBrLib.Prg
Código: Selecionar todos
#include "FiveWin.ch"
#define DLL_CDECL 0x08
#define DLL_STDCALL 0x20
#define DLL_SYSTEM 0x04
#define STR_LEN 256
#define ACBrLIB 'ACBrNFe32.dll'
CREATE CLASS ACBrNFe
HIDDEN:
VAR hHandle
METHOD CheckResult(hResult)
METHOD ProcessResult(buffer, bufferLen)
VISIBLE:
METHOD New(eArqConfig, eChaveCrypt) CONSTRUCTOR
DESTRUCTOR Destroy
METHOD Nome
METHOD Versao
METHOD ConfigLer(eArqConfig)
METHOD ConfigGravar(eArqConfig)
METHOD ConfigLerValor(eSessao, eChave)
METHOD ConfigGravarValor(eSessao, eChave, eValor)
METHOD CarregarXML(eArquivoOuXml)
METHOD CarregarINI(eArquivoOuIni)
METHOD ObterXml(AIndex)
METHOD GravarXml(AIndex, eNomeArquivo, ePathArquivo)
METHOD ObterIni(AIndex)
METHOD GravarIni(AIndex, eNomeArquivo, ePathArquivo)
METHOD CarregarEventoXML(eArquivoOuXml)
METHOD CarregarEventoINI(eArquivoOuIni)
METHOD LimparLista()
METHOD LimparListaEventos()
METHOD Assinar()
METHOD Validar()
METHOD ValidarRegrasdeNegocios()
METHOD VerificarAssinatura()
METHOD GerarChave(ACodigoUF, ACodigoNumerico, AModelo, ASerie, ANumero, ATpEmi, AEmissao, ACNPJCPF)
METHOD ObterCertificados()
METHOD GetPath(tipo)
METHOD GetPathEvento(aCodEvento)
METHOD StatusServico()
METHOD Consultar(eChaveOuNFe, AExtrairEventos)
METHOD Inutilizar(ACNPJ, AJustificativa, Ano, Modelo, Serie, NumeroInicial, NumeroFinal)
METHOD Enviar(ALote, Imprimir, Sincrono, Zipado)
METHOD ConsultarRecibo(ARecibo)
METHOD Cancelar(eChave, eJustificativa, eCNPJ, ALote)
METHOD EnviarEvento(ALote)
METHOD DistribuicaoDFePorUltNSU(acUFAutor, eCNPJCPF, eultNSU)
METHOD DistribuicaoDFePorNSU(acUFAutor, eCNPJCPF, eNSU)
METHOD DistribuicaoDFePorChave(acUFAutor, eCNPJCPF, echNFe)
METHOD EnviarEmail(ePara, eChaveNFe, aEnviaPDF, eAssunto, eMensagem, eCc, eAnexos)
METHOD EnviarEmailEvento(ePara, eChaveEvento, eChaveNFe, aEnviaPDF, eAssunto, eMensagem, eCc, eAnexos)
METHOD Imprimir(cImpressora, nNumCopias, cProtocolo, bMostrarPreview, cMarcaDagua, bViaConsumidor, bSimplificado)
METHOD ImprimirPDF()
METHOD ImprimirEvento(eArquivoXmlNFe, eArquivoXmlEvento)
METHOD ImprimirEventoPDF(eArquivoXmlNFe, eArquivoXmlEvento)
METHOD ImprimirInutilizacao(eArquivoXml)
METHOD ImprimirInutilizacaoPDF(eArquivoXml)
END CLASS
METHOD New(eArqConfig, eChaveCrypt) CLASS ACBrNFe
local hResult, buffer, bufferLen, oErr
eArqConfig :=if(eArqConfig = nil, '', eArqConfig)
eChaveCrypt:=if(eChaveCrypt = nil, '', eChaveCrypt)
::hHandle := DllLoad(ACBrLIB)
if EMPTY(::hHandle) // Eric.Developer: xHarbour retorna 0x00000000
oErr := ErrorNew()
oErr:Severity := 2 // ES_ERROR
oErr:Description := "Erro a carregar a dll [" + ACBrLIB + "]"
// Throw(oErr)
endif
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_Inicializar", hb_StrToUTF8(eArqConfig), hb_StrToUTF8(eChaveCrypt))
::CheckResult(hResult)
RETURN Self
PROCEDURE Destroy CLASS ACBrNFe
DllCall(::hHandle, DLL_STDCALL, "NFE_Finalizar")
DllUnload(::hHandle)
RETURN
METHOD CheckResult(hResult) CLASS ACBrNFe
local buffer, bufferLen, oErr
if hResult >= 0
RETURN nil
endif
bufferLen := STR_LEN
buffer := Space(bufferLen)
DllCall(::hHandle, DLL_STDCALL, "NFE_UltimoRetorno", @buffer, @bufferLen)
if bufferLen > STR_LEN
buffer := Space(bufferLen)
DllCall(::hHandle, DLL_STDCALL, "NFE_UltimoRetorno", @buffer, @bufferLen)
endif
oErr := ErrorNew()
oErr:Severity := 2 // ES_ERROR
oErr:Description := hb_UTF8ToStr(buffer)
// Throw(oErr)
RETURN nil
METHOD ProcessResult(buffer, bufferLen) CLASS ACBrNFe
if bufferLen > STR_LEN
buffer := Space(bufferLen)
DllCall(::hHandle, DLL_STDCALL, "NFE_UltimoRetorno", @buffer, @bufferLen)
endif
RETURN buffer
METHOD Nome CLASS ACBrNFe
local hResult, buffer, bufferLen
bufferLen := STR_LEN
buffer := Space(bufferLen)
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_Nome", @buffer, @bufferLen)
::CheckResult(hResult)
RETURN ::ProcessResult(buffer, bufferLen)
METHOD Versao CLASS ACBrNFe
local hResult, buffer, bufferLen
bufferLen := STR_LEN
buffer := Space(bufferLen)
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_Versao", @buffer, @bufferLen)
::CheckResult(hResult)
RETURN ::ProcessResult(buffer, bufferLen)
METHOD ConfigLer(eArqConfig) CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_ConfigLer", hb_StrToUTF8(eArqConfig))
::CheckResult(hResult)
RETURN nil
METHOD ConfigGravar(eArqConfig) CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_ConfigGravar", hb_StrToUTF8(eArqConfig))
::CheckResult(hResult)
RETURN nil
METHOD ConfigLerValor(eSessao, eChave) CLASS ACBrNFe
local hResult, buffer, bufferLen
bufferLen := STR_LEN
buffer := Space(bufferLen)
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_ConfigLerValor", hb_StrToUTF8(eSessao), hb_StrToUTF8(eChave), @buffer, @bufferLen)
::CheckResult(hResult)
RETURN ::ProcessResult(buffer, bufferLen)
METHOD ConfigGravarValor(eSessao, eChave, eValor) CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_ConfigGravarValor", hb_StrToUTF8(eSessao), hb_StrToUTF8(eChave), hb_StrToUTF8(eValor))
::CheckResult(hResult)
RETURN nil
METHOD CarregarXML(eArquivoOuXml) CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_CarregarXML", hb_StrToUTF8(eArquivoOuXml))
::CheckResult(hResult)
RETURN nil
METHOD CarregarINI(eArquivoOuIni) CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_CarregarINI", hb_StrToUTF8(eArquivoOuIni))
::CheckResult(hResult)
RETURN nil
METHOD ObterXml(AIndex) CLASS ACBrNFe
local hResult, buffer, bufferLen
bufferLen := STR_LEN
buffer := Space(bufferLen)
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_ObterXml", AIndex, @buffer, @bufferLen)
::CheckResult(hResult)
RETURN ::ProcessResult(buffer, bufferLen)
METHOD GravarXml(AIndex, eNomeArquivo, ePathArquivo) CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_GravarXml", AIndex, hb_StrToUTF8(eNomeArquivo), hb_StrToUTF8(ePathArquivo))
::CheckResult(hResult)
RETURN nil
METHOD ObterIni(AIndex) CLASS ACBrNFe
local hResult, buffer, bufferLen
bufferLen := STR_LEN
buffer := Space(bufferLen)
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_ObterIni", AIndex, @buffer, @bufferLen)
::CheckResult(hResult)
RETURN ::ProcessResult(buffer, bufferLen)
METHOD GravarIni(AIndex, eNomeArquivo, ePathArquivo) CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_GravarIni", AIndex, hb_StrToUTF8(eNomeArquivo), hb_StrToUTF8(ePathArquivo))
::CheckResult(hResult)
RETURN nil
METHOD CarregarEventoXML(eArquivoOuXml) CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_CarregarEventoXML", hb_StrToUTF8(eArquivoOuXml))
::CheckResult(hResult)
RETURN nil
METHOD CarregarEventoINI(eArquivoOuIni) CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_CarregarEventoINI", hb_StrToUTF8(eArquivoOuIni))
::CheckResult(hResult)
RETURN nil
METHOD LimparLista() CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_LimparLista")
::CheckResult(hResult)
RETURN nil
METHOD LimparListaEventos() CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_LimparListaEventos")
::CheckResult(hResult)
RETURN nil
METHOD Assinar() CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_Assinar")
::CheckResult(hResult)
RETURN nil
METHOD Validar() CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_Validar")
::CheckResult(hResult)
RETURN nil
METHOD ValidarRegrasdeNegocios() CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_ValidarRegrasdeNegocios")
::CheckResult(hResult)
RETURN nil
METHOD VerificarAssinatura() CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_VerificarAssinatura")
::CheckResult(hResult)
RETURN nil
METHOD GerarChave(ACodigoUF, ACodigoNumerico, AModelo, ASerie, ANumero, ATpEmi, AEmissao, ACNPJCPF) CLASS ACBrNFe
local hResult, buffer, bufferLen
bufferLen := STR_LEN
buffer := Space(bufferLen)
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_GerarChave", ACodigoUF, ACodigoNumerico, AModelo, ASerie, ANumero, ATpEmi, AEmissao, ACNPJCPF, @buffer, @bufferLen)
::CheckResult(hResult)
RETURN ::ProcessResult(buffer, bufferLen)
METHOD ObterCertificados() CLASS ACBrNFe
local hResult, buffer, bufferLen
bufferLen := STR_LEN
buffer := Space(bufferLen)
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_ObterCertificados", @buffer, @bufferLen)
::CheckResult(hResult)
RETURN ::ProcessResult(buffer, bufferLen)
METHOD GetPath(tipo)
local hResult, buffer, bufferLen
bufferLen := STR_LEN
buffer := Space(bufferLen)
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_GetPath", tipo, @buffer, @bufferLen)
::CheckResult(hResult)
RETURN ::ProcessResult(buffer, bufferLen)
METHOD GetPathEvento(aCodEvento)
local hResult, buffer, bufferLen
bufferLen := STR_LEN
buffer := Space(bufferLen)
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_GetPathEvento", hb_StrToUTF8(aCodEvento), @buffer, @bufferLen)
::CheckResult(hResult)
RETURN ::ProcessResult(buffer, bufferLen)
METHOD StatusServico() CLASS ACBrNFe
local hResult, buffer, bufferLen
bufferLen := STR_LEN
buffer := Space(bufferLen)
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_StatusServico", @buffer, @bufferLen)
::CheckResult(hResult)
RETURN ::ProcessResult(buffer, bufferLen)
METHOD Consultar(eChaveOuNFe, AExtrairEventos) CLASS ACBrNFe
local hResult, buffer, bufferLen
bufferLen := STR_LEN
buffer := Space(bufferLen)
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_Consultar", hb_StrToUTF8(eChaveOuNFe), AExtrairEventos, @buffer, @bufferLen)
::CheckResult(hResult)
RETURN ::ProcessResult(buffer, bufferLen)
METHOD Inutilizar(ACNPJ, AJustificativa, Ano, Modelo, Serie, NumeroInicial, NumeroFinal) CLASS ACBrNFe
local hResult, buffer, bufferLen
bufferLen := STR_LEN
buffer := Space(bufferLen)
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_Inutilizar", hb_StrToUTF8(ACNPJ), hb_StrToUTF8(AJustificativa), Ano, Modelo, Serie, NumeroInicial, NumeroFinal, @buffer, @bufferLen)
::CheckResult(hResult)
RETURN ::ProcessResult(buffer, bufferLen)
METHOD Enviar(ALote, Imprimir, Sincrono, Zipado) CLASS ACBrNFe
local hResult, buffer, bufferLen
bufferLen := STR_LEN
buffer := Space(bufferLen)
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_Enviar", ALote, Imprimir, Sincrono, Zipado, @buffer, @bufferLen)
::CheckResult(hResult)
RETURN ::ProcessResult(buffer, bufferLen)
METHOD ConsultarRecibo(ARecibo) CLASS ACBrNFe
local hResult, buffer, bufferLen
bufferLen := STR_LEN
buffer := Space(bufferLen)
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_ConsultarRecibo", hb_StrToUTF8(ARecibo), @buffer, @bufferLen)
::CheckResult(hResult)
RETURN ::ProcessResult(buffer, bufferLen)
METHOD Cancelar(eChave, eJustificativa, eCNPJ, ALote) CLASS ACBrNFe
local hResult, buffer, bufferLen
bufferLen := STR_LEN
buffer := Space(bufferLen)
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_Cancelar", hb_StrToUTF8(eChave), hb_StrToUTF8(eJustificativa), hb_StrToUTF8(eCNPJ), ALote, @buffer, @bufferLen)
::CheckResult(hResult)
RETURN ::ProcessResult(buffer, bufferLen)
METHOD EnviarEvento(ALote) CLASS ACBrNFe
local hResult, buffer, bufferLen
bufferLen := STR_LEN
buffer := Space(bufferLen)
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_EnviarEvento", ALote, @buffer, @bufferLen)
::CheckResult(hResult)
RETURN ::ProcessResult(buffer, bufferLen)
METHOD DistribuicaoDFePorUltNSU(acUFAutor, eCNPJCPF, eultNSU) CLASS ACBrNFe
local hResult, buffer, bufferLen
bufferLen := STR_LEN
buffer := Space(bufferLen)
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_DistribuicaoDFePorUltNSU", acUFAutor, hb_StrToUTF8(eCNPJCPF), hb_StrToUTF8(eultNSU), @buffer, @bufferLen)
::CheckResult(hResult)
RETURN ::ProcessResult(buffer, bufferLen)
METHOD DistribuicaoDFePorNSU(acUFAutor, eCNPJCPF, eNSU) CLASS ACBrNFe
local hResult, buffer, bufferLen
bufferLen := STR_LEN
buffer := Space(bufferLen)
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_DistribuicaoDFePorNSU", acUFAutor, hb_StrToUTF8(eCNPJCPF), hb_StrToUTF8(eNSU), @buffer, @bufferLen)
::CheckResult(hResult)
RETURN ::ProcessResult(buffer, bufferLen)
METHOD DistribuicaoDFePorChave(acUFAutor, eCNPJCPF, echNFe) CLASS ACBrNFe
local hResult, buffer, bufferLen
bufferLen := STR_LEN
buffer := Space(bufferLen)
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_DistribuicaoDFePorChave", acUFAutor, hb_StrToUTF8(eCNPJCPF), hb_StrToUTF8(echNFe), @buffer, @bufferLen)
::CheckResult(hResult)
RETURN ::ProcessResult(buffer, bufferLen)
METHOD EnviarEmail(ePara, eChaveNFe, aEnviaPDF, eAssunto, eMensagem, eCc, eAnexos) CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_EnviarEmail", hb_StrToUTF8(ePara), hb_StrToUTF8(eChaveNFe), aEnviaPDF, hb_StrToUTF8(eAssunto), hb_StrToUTF8(eMensagem), hb_StrToUTF8(eCc), hb_StrToUTF8(eAnexos))
::CheckResult(hResult)
RETURN nil
METHOD EnviarEmailEvento(ePara, eChaveEvento, eChaveNFe, aEnviaPDF, eAssunto, eMensagem, eCc, eAnexos) CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_EnviarEmailEvento", hb_StrToUTF8(ePara), hb_StrToUTF8(eChaveEvento), hb_StrToUTF8(eChaveNFe), aEnviaPDF, hb_StrToUTF8(eAssunto), hb_StrToUTF8(eMensagem), hb_StrToUTF8(eCc), hb_StrToUTF8(eAnexos))
::CheckResult(hResult)
RETURN nil
METHOD Imprimir(cImpressora, nNumCopias, cProtocolo, bMostrarPreview, cMarcaDagua, bViaConsumidor, bSimplificado) CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_Imprimir", hb_StrToUTF8(cImpressora), nNumCopias, hb_StrToUTF8(cProtocolo), hb_StrToUTF8(bMostrarPreview), hb_StrToUTF8(cMarcaDagua), hb_StrToUTF8(bViaConsumidor), hb_StrToUTF8(bSimplificado))
::CheckResult(hResult)
RETURN nil
METHOD ImprimirPDF() CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_ImprimirPDF")
::CheckResult(hResult)
RETURN nil
METHOD ImprimirEvento(eArquivoXmlNFe, eArquivoXmlEvento) CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_ImprimirEvento", hb_StrToUTF8(eArquivoXmlNFe), hb_StrToUTF8(eArquivoXmlEvento))
::CheckResult(hResult)
RETURN nil
METHOD ImprimirEventoPDF(eArquivoXmlNFe, eArquivoXmlEvento) CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_ImprimirEventoPDF", hb_StrToUTF8(eArquivoXmlNFe), hb_StrToUTF8(eArquivoXmlEvento))
::CheckResult(hResult)
RETURN nil
METHOD ImprimirInutilizacao(eArquivoXml) CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_ImprimirInutilizacao", hb_StrToUTF8(eArquivoXml))
::CheckResult(hResult)
RETURN nil
METHOD ImprimirInutilizacaoPDF(eArquivoXml) CLASS ACBrNFe
local hResult
hResult := DllCall(::hHandle, DLL_STDCALL, "NFE_ImprimirInutilizacaoPDF", hb_StrToUTF8(eArquivoXml))
::CheckResult(hResult)
RETURN nil
Oscar Ribeiro
xHarbour+Fwh+WorkShop
xHarbour+Fwh+WorkShop

