De antemão peço desculpas se postei no lugar errado.
Meu patrão me pediu para investigar se é possÃvel fazer uma função em Delphi (dentro de uma dll) em que ele irá utilizar na sua linguagem Clipper/xHarbour onde o parâmetro passado seja um Array.
De Delphi (exe) para Delphi (dll) dá certo, basicamente passando o endereço da variável. Como o tipo de array declarado na dll é o mesmo no programa executável em que uso para testar a dll, funciona corretamente.
Código da DLL (é apenas um teste)
library vetor;
uses
System.SysUtils,
System.Classes,
Vcl.Dialogs;
type
TArrayofString = array of string;
// TArrayofString = array[1..100] of string;
{$R *.res}
procedure AVetor(pVetor: TArrayofString; Colunas: Byte); stdcall; export;
var
I: Byte;
Tamanho: Byte;
begin
SetLength(pVetor, Colunas);
for I := 1 to Colunas do
showmessage(pVetor[I]);
end;
exports
AVetor;
begin
end.
Código do Executável para testar a dll (em Delphi)
unit uTesteVetor;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons;
type
TfrmTesteVetor = class(TForm)
btnTestar: TBitBtn;
procedure btnTestarClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TArrayofString = array of string;
var
frmTesteVetor: TfrmTesteVetor;
implementation
{$R *.dfm}
procedure AVetor(pVetor: TArrayofString; Colunas: Byte); stdcall; external 'vetor.dll';
procedure TfrmTesteVetor.btnTestarClick(Sender: TObject);
var
loVetor: TArrayofString;
begin
SetLength(loVetor, 3);
loVetor[1] := 'Coluna 1';
loVetor[2] := 'Coluna 2';
loVetor[3] := 'Coluna 3';
AVetor(loVetor, 3);
ShowMessage('Fim.');
Close;
end;
end.
Abaixo segue o código de um pequeno prg (exe) criado pelo meu chefe para testar já com Clipper/xHarbour
func main()
aviso("Entrou",0)
NDLL_pro := LoadLibrary("vetor.dll")
clear
mretorno = space(20)
declare vetor[255]
vetor[1]="MARCOS"
VETOR[2]="MAURO"
VETOR[3]="RAFAEL"
MITENS=3
mret_dll := DLLCALL(NDLL_pro, 32, "AVetor", mretorno, vetor, MITENS)
Talvez se passasse o endereço do array (ponteiro?) como parâmetro e o Delphi sabendo manipular como um Array interno poderá dar certo. Mas não sou expert no assunto e peço ajuda a vocês.
A função acima se destina para o seguinte: meu chefe em seu programa Clipper/xHarbour exibe uma tela quando gera um relatório informando os resultados como uma visualização (preview). Porém, os procedimentos que ele utiliza comporta 80 caracteres na coluna. Vi até uns tópicos sobre esse problema aqui no fórum e passei para ele. Mas como ele quer melhorar a estética da apresentação desse resultado em tela, ele insistiu se tem como passar um array... A necessidade dele é de uma função genérica que ele poderá usar em qualquer relatório (visualização de informações na tela).
Foi mal se não expliquei direito, mas não entendo de Clipper/xHarbour. E ainda estou começando em Delphi.
Obrigado a todos.