Como utilizar DLL no Protheus?

Como utilizar DLL no Protheus

A muitos anos atrás, assim que passei a atuar na equipe de ACD da TOTVS (SIGAACD), um dos grandes desafios era acessar uma DLL de terceiro, pois atuávamos com muitos equipamentos e periféricos, e para minha surpresa descobri que além de ser uma tarefa muito simples o acesso a uma DLL, também conseguiria executar de qualquer outro sistema (windows) rotinas automáticas do TOTVS Protheus sem o uso de webservices ou EDI.

Abaixo é apresada as seguintes funções que iremos utilizar:

  1. ExecInClient;
  2. ExecInDLLOpen;
  3. ExeDllRun;
  4. ExeDllRun2;
  5. ExeDLLRun3;
  6. ExecInDllClose;

Mas antes vamos a algumas definições.


O que é uma DLL?

DLL é a sigla para “Dynamic Link Library”, que consiste em uma biblioteca dinâmica contendo dados que podem ser acessados por mais de um programa instalado no computador, mesmo que simultaneamente. Uma DLL pode ser composta por sub-rotinas armazenadas em disco, podendo ser carregadas na memória e executadas quando um aplicativo realiza o seu acesso.
Em uma DLL podemos encontrar dados ou recursos tais como:

  • ícones;
  • fontes;
  • entre outros.

Por que usar DLLs?

Utilizar funções que são especificas de um determinado fabricante que seu conhecimento não é de livre acesso, ou outra vantagens de usar DLL está na economia de recursos. Quando vários programas utilizam uma mesma biblioteca de funções, o emprego de DLLs faz com que a duplicação do código carregado no disco e na memória física seja reduzida, melhorando tanto o desempenho dos aplicativos ativos (em primeiro plano) quanto das aplicações rodando em plano de fundo.


ExecInClient

Executa um conjunto de ações pré-definidas, no Smart Client, como tratamentos específicos para cada sistema operacional (Windows/Linux).

Sintaxe

ExecInDllRun( < nHandle >, < nOpc >, < cBuffer > )

Parâmetros:

Nome

Tipo

Descrição

Obrigatório

Referência

nHandle caractere Indica o handle da DLL obtida através da função ExecInDLLOpen(). X
nOpc numérico Indica a opção que será executada pela DLL. X
cBuffer caractere Indica o buffer, no formato caracter, que será recebido pela DLL. X

ExecInDLLOpen

Abre uma DLL (Dynamic-link library , ou Biblioteca de vinculo dinâmica) para executar functions ou procedures;

Sintaxe

ExecInDllOpen( < cDLLName > )

Parâmetros

Nome

Tipo

Descrição

Obrigatório

Referência

cDLLName caractere Indica o nome e caminho da DLL. X

Retorno

Nome

Tipo

Descrição

nHandle numérico Retorna o handle de abertura da DLL.

ExeDllRun

Executa funções ou procedures de uma DLL (Dynamic-link library , ou Biblioteca de vinculo dinâmica).

Sintaxe

ExecInDllRun( < nHandle >, < nOpc >, < cBuffer > )

Parâmetros

Nome

Tipo

Descrição

Obrigatório

Referência

nHandle caractere Indica o handle da DLL obtida através da função ExecInDLLOpen(). X
nOpc numérico Indica a opção que será executada pela DLL. X
cBuffer caractere Indica o buffer, no formato caracter, que será recebido pela DLL. X

Observações

  • Esta função retorna o valor da DLL com limite de 259 caracteres, para ser passada como referencia. Caso necessite um tamanho maior, utilize a ExeDLLRun2.
  • Para o nome da função na DLL, é obrigatório utilizar ExecInClientDLL, e manter essa assinatura para o correto funcionamento dos parâmetros.

ExeDLLRun2

Executa funções ou procedures de uma DLL (Dynamic-link library , ou Biblioteca de vinculo dinâmica)

Sintaxe

ExeDLLRun2( < nHandle >, < nOpc >, < cBuffer > )

Parâmetros

Nome

Tipo

Descrição

Obrigatório

Referência

nHandle caractere Indica o handle da DLL obtida através da função ExecInDLLOpen(). X
nOpc numérico Indica a opção que será executada pela DLL. X
cBuffer caractere Indica o buffer, no formato caracter, que será recebido pela DLL. X

Observações

  • A variável cBuffer tem limite de 20000 caracteres, para ser passada como referencia.

ExeDLLRun3

Executa funções ou procedures de uma DLL (Dynamic-link library , ou Biblioteca de vinculo dinâmica).

Sintaxe

ExeDLLRun3( < nHandle >, < nOpc >, < cBuffer > )

Parâmetros

Nome

Tipo

Descrição

Obrigatório

Referência

nHandle caractere Indica o handle da DLL obtida através da função ExecInDLLOpen(). X
nOpc numérico Indica a opção que será executada pela DLL. X
cBuffer caractere Indica o buffer, no formato caracter, que será recebido pela DLL. X

Observações

  • A variável cBuffer tem limite de 20000 caracteres, para ser passada como referencia.

 


ExecInDllClose

Encerra a conexão com uma DLL (Dynamic-link library , ou Biblioteca de vinculo dinâmica).

Sintaxe

ExecInDllClose( < nHandle > )

Parâmetros

Nome

Tipo

Descrição

Obrigatório

Referência

nHandle numérico Indica o handle da DLL obtida através da função ExecInDLLOpen().

X

 


Exemplos

1
2
3
4
5
6
7
8
9
10
11
extern "C" __declspec(dllexport) void ExecInClientDLL(int ID, char * Buf, char * Buf2, int nBuf2)
{
  if(ID==1)
  {
    strcpy(Buf2,"Retorno opção 01");
  }
  else if (ID == 2)
  {
    strcpy(Buf2, "Retorno opção 02");
  }
}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
User Function Exemplo()
Local hHdl := 0,buffer := "",xRet1 := 0
// Abre Dll
hHdl := ExecInDLLOpen( "TSTDLL.DLL" )
// ----------------------------------------------------------------
// Envia comando para execução, repare que estamos
// usando a opção "1" no momento de chamar a DLL.
// ----------------------------------------------------------------
// ExecInDllRun não retorna valor da DLL
buffer:= "Executando a partir da ExecInDllRun..."
xRet1 := ExecInDllRun( hHdl, 1, @buffer )
alert("Retorno da ExecInDllRun: " + xRet1)
// ExeDllRun2 retorna valor numérico da DLL
buffer:= "Executando a partir da ExeDllRun2..."
nRet2 := ExeDllRun2( hHdl, 1, @buffer )
alert("Retorno da ExeDllRun2: " + StrZero(nRet2,3))
// ----------------------------------------------------------------
// Fecha a DLL
ExecInDllClose( hHdl )
Return

Caso precise de apoio, a iMind conta com fábrica de software e profissionais altamente qualificados para lhe ajudar, nos projetos de programação e processos de sigaacd automação e colata de dados e consultoria protheus.