Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 2130 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Olá pessoal, estou tendo alguns problemas com essa impressora. ela é do tipo que você pode gravar o cartão (contact less) e depois o imprime 

o que preciso fazer para isso é comanda-la para que ela posicione o cartão para que eu possa grava-lo e logo após imprimi-lo 

para isso tenho uma dll (SmartComm2.dll) que disponibiliza alguns comandos como: 

 

Código:

var 
  SmartComm_GetDeviceList2: function (out P_Lista: int64 ? int64;  register   ; 
  SmartComm_OpenDevice2   : function (out HSMART: PHandle; const szDevice: widestring; const nDevType: int64):boolean; register; 



a 1° coisa que faço é carregar a dll e suas funções 

Código:

  hInstanceDll:= LoadLibrary(pAnsiChar('SmartComm2.dll')); 
  if hInstanceDll > 0 then 
  begin 
    Result.Msg := 'Dll SmartComm2 Carregada com sucesso'; 
    SmartComm_GetDeviceList2:= GetProcAddress(hInstanceDll, pAnsiChar('SmartComm_GetDeviceList')); 
    SmartComm_GetDeviceInfo2:= GetProcAddress(hInstanceDll, pAnsiChar('SmartComm_GetDeviceInfo2')); 
    SmartComm_OpenDevice2   := GetProcAddress(hInstanceDll, pAnsiChar('SmartComm_OpenDevice2')); 
  end; 



meu problema está no usos destas funções, pois quando as usos como por exemplo 
 

Código:

Result.Ok := SmartComm_OpenDevice2(print, 'SMART', SMART_OPENDEVICE_BYID); 


ou 

Código:

res := SmartComm_GetDeviceList2(tst) 



as funções vem com retorno, só que os parâmetros out não são alterados, eles permanecem os mesmo que antes da chamada das funções 

obs.: estou criando essas funções como variáveis pois no sistema já consigo tratar outra impressora da marca Evolin e pra não ficar toda hora perguntando se estou usando uma impressora ou outra eu jogo essas "variaveis / funções" dentro de outra que me servirá como uma espécie de "roteador" (não sei o nome desta técnica) 

Código:

if impressora = evolin then 
  cmdPosiciona   := PosicionaCartaoEvolin 
else 
  cmdPosiciona   := PosicionaCartaoSmart; 


Desta forma independente de qual impressora estou usando eu só chamo o comando cmdPosiciona 

obs2: o parametro de saída estou colocando como out, mas, já tentei com var e também não funcionou 

obs3: em vez de register já tentei 
pascal, cdecl, stdcall , safecall e nada deu certo 

qualquer sugestão será bem vinda Very Happy

  • Consultores
Postado
1 hora atrás, Djalma Jr. disse:

obs2: o parametro de saída estou colocando como out, mas, já tentei com var e também não funcionou 

obs3: em vez de register já tentei 
pascal, cdecl, stdcall , safecall e nada deu certo 

qualquer sugestão será bem vinda 

Na verdade você não pode simplesmente ir testando. Você precisa verificar qual o modo da dll realmente trabalhar.

Essa configuração é de acordo com a dll, não com o seu programa.

1 hora atrás, Djalma Jr. disse:

obs.: estou criando essas funções como variáveis pois no sistema já consigo tratar outra impressora da marca Evolin e pra não ficar toda hora perguntando se estou usando uma impressora ou outra eu jogo essas "variaveis / funções" dentro de outra que me servirá como uma espécie de "roteador" (não sei o nome desta técnica) 

Ao invés de usar variáveis para implementar, tente fazer o acesso direto a dll primeiro, usando a diretiva "external". Se for o caso, faça um programa separado só pra testar a comunicação com a DLL.

A longo prazo, sugiro mudar seu modo de fazer. Crie classes/objetos separados para cada impressora. Fazemos isso em diversos componentes ACBr como o ACBrECF, ACBrBAL, ACBrETQ.

 

  • Curtir 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Postado

Bom dia, analisando o SDK vi que usam stdcall, fiz a alteração, mudei a declaração da função para algo do tipo

function SmartComm_GetDeviceList2(out P_Lista: int64 ) :  int64;  stdcall; external 'SmartComm2.dll'; stdcall; 

mas contínua do mesmo jeito :(

Em uma conversa com o pessoal do suporte (que não tá ajudando muito) levantaram a possibilidade de ser alguma inconsistência com o fato do do delphi7 trabalhar com ANSI e o componente com Unicode, será que isso procede?

 

Postado

Outra coisa interessante que descobri agora...

o programa TDUMP do delphi que serve para podermos pegar as funções exportadas das dlls nesta dll dá erro : "ERROR: Internal error at 0x414f59 with base 0x400000"

na outra que já faço uso normalmente o programa funciona diretinho

  • Consultores
Postado
7 horas atrás, Djalma Jr. disse:

Em uma conversa com o pessoal do suporte (que não tá ajudando muito) levantaram a possibilidade de ser alguma inconsistência com o fato do do delphi7 trabalhar com ANSI e o componente com Unicode, será que isso procede?

Acho difícil. Você não está passando strings para as funções, está?

Eles tem algum exemplo de versão de implementação para Delphi/Lazarus que você possa testar?

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Postado
17 horas atrás, EMBarbosa disse:

Acho difícil. Você não está passando strings para as funções, está?

também acho, pois no metodo que esotu usando é só um get sem qualquer parâmetro e ele me retornaria um ponteiro para uma lista, e esta função já não funciona.

17 horas atrás, EMBarbosa disse:

Eles tem algum exemplo de versão de implementação para Delphi/Lazarus que você possa testar?

Não, tenho só em VB6/vb.net/java/visual.c

Delphi que é bom nada hehehe, 

  • Consultores
Postado
21 minutos atrás, Djalma Jr. disse:

e ele me retornaria um ponteiro para uma lista

Mas você definiu essas listas e o ponteiro para elas?

Porque no exemplo que você passou, você está mandando um int64 como parâmetro. Não um ponteiro. Veja:

Em 25/01/2019 at 09:19, Djalma Jr. disse:

function SmartComm_GetDeviceList2(out P_Lista: int64 )

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
  • Consultores
Postado
2 horas atrás, Djalma Jr. disse:

Bom dia

Sim, tentei colocar como int64 por que quando coloco do tipo Pointer ele me retorna $1 o que me causa access violation

 

Eu posso estar enganado porque tem um bom tempo que não faço esse tipo de trabalho, mas você precisa verificar pra que tipo de estrutura é o ponteiro e daí passar um ponteiro pra esse tipo de estrutura. Daí quando houver o retorno, você consegue pegar o ponteiro e receber a estrutura.

Se você tiver um arquivo header em C/C++ talvez queira verificar o seguinte artigo:

http://rvelthuis.de/articles/articles-convert.html

 

  • Curtir 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Postado

 

Olá EMBarbosa

Quando eu tentei como ponteiro eu declarei o ponteiro com a estrutura que a documentação pede, conforme vc disse, e ele me retorna esse tal de $1
 

já desistimos de usar essa DLL diretamente, estamos fazendo agora um sistema em .net que fará a intermediação entre o meu sistema Delphi e essa porqueira de DLL... 

  • Curtir 1
  • Consultores
Postado

Ok. Espero que tenham sucesso.

  • Curtir 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
  • Este tópico foi criado há 2130 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...