Passagem de parâmetros
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:
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.
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
Curtidas 0
Respostas
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
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
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
06/12/2007
No caso da Daruma ou Bematech, basta você chamar a função da dll.
Exemplo:
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.
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
06/12/2007
Bruno, valeu pela sugestão, mas não deu certo.
GOSTEI 0
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
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
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
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
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:
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.
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
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