Erro na criação de uma DLL para comunicação com o convênio Vidalink

Delphi

28/06/2011

Prezados,

Estou criando uma dll para ser utilizada pelo software da Vidalink, que deve ter a seguinte função:

 

library Integracao_Vidalink_Produtos;

uses
  SysUtils,
  Classes,
  Dialogs,
  uDm in 'uDm.pas' {dm: TDataModule};

{$R *.res}

function LeProdLoja( sCateg, sKey : pAnsiChar; byTrataPeso, byDeciPeso, byArredonda,
                     byDescr40 : Byte; ptrBuffProd, prtBuffAssoc : pAnsiChar ): ShortInt; stdcall;
begin
  ptrBuffProd:= pAnsiChar('       ALENIA                                         00000111000000011100');
  ShowMessage('3 - ' + sKey + ' - ' + ptrBuffProd + ' - ' + IntToStr(length(ptrBuffProd)));
  Result:= 0;
end;

exports
  LeProdLoja;

begin
end.



A assinatura da função tem q ser obedecida, sendo que o sKey é um ean (entrada) e o ptrBuffProd um Char(75)que é de saída.
Os outros parametros não estão mais em uso e são mantidos apenas para compatibilidade.

Ocorre que o software que vai utilizar a dll não esta recebendo a informação que estou passando para o ptrBuffProd.

Como é minha primeira dll, sei que estou fazendo algo errado, mas o que ?

Um detalhe, tentei incluir um var ptrBuffProd na assinatura da função, mas o erro persistiu.

Agradeço a ajuda dos colegas,

Marcello.
Marcello Cainelli

Marcello Cainelli

Curtidas 0

Respostas

Marcello Cainelli

Marcello Cainelli

28/06/2011

Prezados,

Vou postar aqui a solução, para o caso de alguém passar pelo mesmo problema:

1. Não utilizar o var, pois o pChar é um ponteiro, e por consequencia, já é passado por referência;
2. Utilizar a função StrPCopy para converter a string em PChar.

function 
DadosProduto(sCateg, sKey: 
PChar; byTrataPeso, byDeciPeso, byArredonda,
  byDescr40: 
Byte; ptrBuffProd: 
PChar; ptrBuffAssoc: 
PChar): ShortInt; stdcall;
var
Str_ptrBuffProd : String;
.....
 
Str_ptrBuffProd := 
‘       TESTE 
                                         00000033330000003333’;
 
StrPCopy( 
ptrBuffProd, 
Str_ptrBuffProd 
);


Essas instruções foram passados pelo suporte da Vidalink e resolveram o problema.

Marcello.
GOSTEI 0
Afonso Casseli

Afonso Casseli

28/06/2011

Olá Marcelo, estou com o mesmo problema. Fiz o que você explicou mas não deu certo.
Você poderia postar o código da função aqui no forum, to levando uma surra pra fazer funcionar essa dll rsrs.
Grato.
GOSTEI 0
Marcello Cainelli

Marcello Cainelli

28/06/2011

Segue abaixo o código da minha dll:

library Integracao_Vidalink_Produtos;

uses
  SysUtils,
  Classes,
  uDm in uDm.pas {dm: TDataModule};

{$R *.res}

function LeProdLoja( sCateg, sKey : pAnsiChar; byTrataPeso, byDeciPeso, byArredonda,
                     byDescr40 : Byte; ptrBuffProd, prtBuffAssoc : pAnsiChar ): ShortInt; stdcall;
var
  str_ptrBuffProd : String;
begin
  dm:= Tdm.Create(nil);
  Try
    with dm do begin
      SQLDataSet.Close;
      SQLDataSet.Params[0].AsString:= sKey;
      SQLDataSet.Open;
      If not SQLDataSet.Fields[0].IsNull then begin
        str_ptrBuffProd:= StringOfChar( ,7) +
                          Format(%-35s,[Copy(SQLDataSet.FieldByName(NOME_PROD).AsAnsiString,1,35)]) +
                          StringOfChar( ,12) +
                          PoeZeros(CurrToStr(SQLDataSet.FieldByName(PRECO_VEND).AsCurrency  * 100),10,0) +
                          PoeZeros(CurrToStr(SQLDataSet.FieldByName(PRECO_VEND).AsCurrency  * 100),10,0) +  ;
        StrPCopy( ptrBuffProd, str_ptrBuffProd );
        Result:= 0;
      end else
        Result:= 1;
    end;//with dm
  finally
    FreeAndNil(dm);
  end;
end;

exports
  LeProdLoja;

begin
end.
GOSTEI 0
Afonso Casseli

Afonso Casseli

28/06/2011

Obrigado Marcelo, vou adaptar ela na minha aplicação e retorno pra postar o resultado.
GOSTEI 0
POSTAR