Passagem de parâmetros

Delphi

06/12/2007

Estou com o seguinte problema: tenho que fazer uma DLL quer irá ser utilizada por outra DLL já existente. A minha DLL irá acessar outras DLL´s de fabricantes de impressora(BemaFI32.dll, Daruma32.dll, InterfaceEpson.dll).

Minha DLL exporta uma função com a seguinte assinatura:

function NumeroSerie(ANumeroSerie: string): Integer; stdcall;


A DLL existente chama esse método que exporto e eu me encarrego de chamar o método do fabricante correto. Com a Bematech e Daruma tudo funciona OK. Mesmo sem usar VAR na passagem de parâmetro, o número de série vem para a DLL chamadora. Não sei como, se alguem puder responder ficaria grato.

Meu problema está no caso da Epson. Para retornar o número de série do exemplo, tenho que fazer outras operações e para retornar o número de série teria que passar o parâmetro por referência e não por valor.

Alguem pode me indicar um caminho.

TECF = class
  function NumeroSerie(ASerie: string): Integer;
end;

TBematech = class(TECF)
  function NumeroSerie(ASerie: string): Integer;
end;

TDaruma = class(TECF)
  function NumeroSerie(ASerie: string): Integer;
end;


// Aqui não funciona, pois para achar o número de série
// tenho q fazer outras operações, ao contrários
// das outras dll´s onde eu chamo o método direto
// e passo o parâmetro ASerie.
TEpson = class(TECF)
  function NumeroSerie(ASerie: string): Integer;
end;



Rjun

Rjun

Curtidas 0

Respostas

Bruno Belchior

Bruno Belchior

06/12/2007

RJun, tente alterar suas funções para trabalharem com PChar, ao invés de string... Dessa maneneira ´creio eu´ que sua alteração ira refletir na variável mesmo sem o [b:266dbd7bac]var[/b:266dbd7bac], pois estará trabalhando com ponteiro...


GOSTEI 0
Edilcimar

Edilcimar

06/12/2007

Eu conheço a bematech, a daruma e a schalter, porém não conheço esta a qual você se refere, mas cada uma delas possui um padrão de retorno de dados, aí é só você pegar um exemplo do próprio fabricante que eles informam como fazer. Em alguns casos, a bematech por exemplo envia uma seqüência de caracteres onde você tem que fazer a divisão dos mesmos para saber o que significa.
Vamos supor que esta impressora retorne
x:= ´abd1234567kitr00379´, onde isto poderia significar que o 121345 fosse o número de série, o abd fosse informações de erro, o kitr e o 00379 fossem outras informações


GOSTEI 0
Rjun

Rjun

06/12/2007

No caso da Daruma ou Bematech, basta você chamar a função da dll.

Exemplo:
function Bematech_FI_NumeroSerie(Serie: string): Integer; stdcall; external ´BemaFI32.dll´

function TClasse.NumeroSerie(Serie: string): integer;
begin
  result := Bematech_FI_NumeroSerie(Serie);
end;


Desse jeito funciona, mesmo eu não usando VAR na passagem de parâmetro. O problema é pra Epson. Como não existe uma função igual a da Bematech, eu tenho q chamar outra função e com o retorno dela encontrar o número de série. O problema é passar para a função chamadora sem usar o VAR.


GOSTEI 0
Rjun

Rjun

06/12/2007

Bruno, valeu pela sugestão, mas não deu certo.


GOSTEI 0
Edilcimar

Edilcimar

06/12/2007

a bematech na realidade retorna uma string muito grande, porém as chamadas de funções dividem esta string retornando apenas aquilo que interessa, mas se você tentar pegar a parte referente ao erro vai ver que vc terá que traduzir isto, pegue a função da bematech
Procedure Analisa_Retorno;
e verá que ela retorna
Ret, ACK, ST1 e ST2
onde você terá que decifrar isto para saber qual foi a resposta da impressora


GOSTEI 0
Bruno Belchior

Bruno Belchior

06/12/2007

Acho que o problema que o amigo RJun se refere não é em como pegar o retorno, mas sim uma maneira de trabalhar a string de forma que o retorno da função funcione de maneira similar a passagem de valores por referência, mas sem usar o [b:42430cc57c]var[/b:42430cc57c]. (Se estiver errado me corrija).


GOSTEI 0
Edilcimar

Edilcimar

06/12/2007

Sim, eu concordo, só que ele tem que ´casar´ o envio de variável dele com a dll do fabricante, pois o retorno se não estiver ´casado´ poderá retornar a string grande ou não retornar nada, e para isto ele deverá verificar o exemplo fornecido pelo fabricante, conforme escrevi na primeira resposta


GOSTEI 0
Rjun

Rjun

06/12/2007

Edilcimar, meu problema não é pegar o número de série, e sim passar para a aplicação chamadora. Com as DLL´s Bematech e Daruma consigo. Com a Epson eu consigo extrair o número, so não estou conseguindo passar para a aplicaçao que fez a chamada.

Eu tentei assim agora:

Defini a função que exporta da seguinte maneira:

// Declaração
function NumeroSerie(var ANumeroSerie: string): Integer; stdcall; export

// Método
function NumeroSerie(var ANumeroSerie: string): Integer; 
begin
  result := ECF.NumeroSrie(ANumeroSerie);
end;


Só que no momento da chamada da função, eu coloco um Watch para o ANumeroSerie eu não consigo ver o valor da variavel. Se eu tento atribuir algum valor para ANumeroSerie, dá uma exceção.

Lembrando que eu não posso alterar a DLL chamadora.


GOSTEI 0
Edilcimar

Edilcimar

06/12/2007

Eu entendi tudo isto, mas o que eu disse continua valendo, o teu envio tem que ´casar´ com a dll do fabricante, senão você não consegue pegar o resultado, vamos supor que o envio correto tenha que ser ´@x¬´, isto é uma string e você está enviando algo numério ou mesmo uma string com formatação diferente da desejada pela dll do fabricante, por isto disse desde o começo para você olhar o exemplo fornecido pelo fabricante para poder efetuar este ´casamento´ de parâmetro


GOSTEI 0
POSTAR