Erro na criação de uma DLL para comunicação com o convênio Vidalink
Prezados,
Estou criando uma dll para ser utilizada pelo software da Vidalink, que deve ter a seguinte função:
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.
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
Curtidas 0
Respostas
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.
Essas instruções foram passados pelo suporte da Vidalink e resolveram o problema.
Marcello.
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
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.
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
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
28/06/2011
Obrigado Marcelo, vou adaptar ela na minha aplicação e retorno pra postar o resultado.
GOSTEI 0