Argow pode ativar e comunicar com diferentes processos, estendendo suas funções, tarefas e janelas, ao disponibilizar API, DLL e componentes para criação de plug-ins.

O conjunto de ferramentas, códigos e documentos que permitem criar plug-ins é chamado de InterProc e sua utilização requer uma licença especifica.

Sem a licença, todas as edições de Argow expõem os procedimentos em modo demonstração, com algumas limitações.

Pela funcionalidade, a comunicação é divida em dois modos: Desligado e Integrado.

Desligado

Os processos desligados podem ser bibliotecas Win32 (DLL) ou programas (EXE) que são abertos desde um script de Argow, de forma modal ou não, e sua execução não interfere com o funcionamento do Argow (além de deter o fluxo do processo, em caso de ser modal).

Os exemplos aqui apresentados podem ser baixados aqui.

Desligado: Programas EXE

Por exemplo, o seguinte script mostra o conteúdo da coluna dicScript.SCRIPTBODY usando notepad.exe.

procedure displayScript();
begin
  arFileSave('c:\temp\dados.txt', SCRIPTBODY, true, false);
  sf.shell.execute('open', 'notepad.exe', 'c:\temp\dados.txt', '', false );
end;

Para testar, execute o script no Commander ou basta associar o script ao botão wizard da janela PAD.

Desligado: Bibliotecas DLL Win32

No caso de uma DLL Win32 são realizadas ligações dinâmicas com as funções exportadas que tem como protótipo:

function( pParam: pWideChar; var iSize: integer ): integer; stdcall

Onde pParam é um pointer a um string Unicode com iSize caracteres (isto é, 2 bytes por caracter). É importante lembrar que as chamadas de funções devem respeitar as maiusculas e minusculas da definição (Export).

No exemplo seguinte, a função exportada editaScript da bilioteca minhaLib.dll é chamada passando como parâmetro o conteúdo da coluna dicScript.SCRIPTBODY:

procedure showScript();
  var cData: string;
begin
  cData:= arVarToStr(SCRIPTBODY);
  sf.shell.call( 'minhaLib.dll', 'editaScript', cData, false );
end;

Ainda, a DLL pode modificar as informações e sinalizar o fato. Veja no script abaixo, quando a função retornar 1 os dados serão salvos:

{$ActiveDataSet DICSCRIPT}  // Commander ativa esta tabela antes de executar
procedure editScript();
  var
    cParam: string;
    iResult: integer;
begin
  // Copiar script mais buffer de edição (1KB*2)
  cParam:= sf.db.ActiveDataSet['SCRIPTBODY'] + StringOfChar( #0, 1024 );
  iResult:= sf.shell.call( 'minhaLib.dll', 'editaScript', cParam, false );
  // iResult: 1= salvar; 0= cancel
  arDebug( 'Result= ' + intTostr( iResult ));
  If ( iResult = 1 ) Then Begin
    arDebug( cParam );
    sf.db.ActiveDataSet.Edit;
    sf.db.ActiveDataSet['SCRIPTBODY']:= cParam;
    sf.db.ActiveDataSet.Post;
  End;
End;

Notar que, por estar em outro processo, a DLL pode mudar o conteúdo e diminuir o tamanho de cParam, mas não aumentar de tamanho, funcionando como um buffer.

O envio de vários parâmetros depende da implementação da DLL. Por exemplo, na ArgowMobile.dll cada parâmetro é separado com ponto-e-vírgula (;).

No exemplo abaixo, um arquivo do PC é copiado ao celular conectado via Windows Mobile Device Center (ou ActiveSync) utilizando a ArgowMobile.dll.

Note que em cParam o nome do arquivo origem e destino são separados por um ponto-e-vírgula (;):

  var
    cParam: string;
    iResult: integer;
begin
  // Copiar arquivo (que está na pasta do Argow)
  // dados.sdf (SQL Server Compact Database File)
  // a pasta Temp do mobile, com nome db.sdf
  cParam:= sf.ar.exeFolder + 'dados.sdf;\Temp\db.sdf';
  iResult:= sf.shell.call( 'ArgowMobile.dll', 'copyPcToMobile', cParam, true );
  If ( iResult = 0 ) Then
    sf.shell.sayInfo( 'Dados copiados!', 'Mobile')
  Else
    sf.shell.sayWarn( 'Falha na copia: ' + intToStr(iResult) , 'Mobile');
End;

Integrado

No modo integrado, os processos externos podem enviar mensagens para Argow e solicitar que efetue tarefas, como atualizar tabelas, enviar textos ao Monitor ou executar scripts.

Alem de isto, quando a comunicação é inicializada, Argow envia um pacote com informações da sessão, o que permite uma conexão segura e ampla.

Os processos podem estar em forma de DLL ou EXE. No primeiro caso, a chamada desde o script e equivalente a do shell, mas utiliza a classe ar.

Continuando com o exemplo anterior, e aproveitando que os processos estão interligados, enviamos o valor da chave primaria (PK) da tabela, e assim permitir que a DLL obtenha, edite e modifique o conteúdo de SCRIPTBODY:

procedure showScript();
  var cPk: string;
begin
  cPk:= arVarToStr(PK);
  sf.ar.call( 'minhalib.dll', 'editadato', cPk, false );
end;

Neste caso o protótipo é

function( const sf: TArDllFrame; pParam: pWideChar; var iSize: integer ): integer; stdcall

onde TArDllFrame é uma estrutura que contem as informações da sessão.

No caso de programas, a ativação e comunicação e feita utilizando a função send (também da classe ar):
procedure showGIS();
begin
  sf.ar.send('meuprog.exe', 'GIS', 7, arVarToStr(PK) );
end;

Onde os parâmetros são:

  1. Nome do programa
  2. Nome do canal, que permite comunicação simultânea com vários programas, ao identificr cada um com um nome diferente.
  3. 'Número de comando' interpretado pelo meuprog.exe no procedimento que trata do evento de comunicação (tipicamente um switch(iCmd)). Quando é zero, finaliza a comunicação, fechando o canal
  4. Um string de dados do usuário, que acompanha ao comando

Recursos

No caso de comunicação desligada, não requer ferramenta adicional. Já para Integrado, temos disponíveis os recursos necessários para uma fácil e completa integração nos dois ambientes mais utilizados na atualidade: dotNet e Delphi (Nativo). Para testar as funcionalidades, estes recursos podem ser solicitados por e-mail.

dotNet

Para dotNet, temos disponível argow.interproc.dll que integra seu projeto a Argow com facilidade.

Delphi

Já para a plataforma Delphi (7 e XEx) temos por um lado uma unit de integração e por outro um conjunto de componentes (derivados do ADO) para conexões equivalentes as utilizadas por Argow.