Jump to content

Delphi Enterprise 
pela METADE DO PREÇO

botao_delphi.png

 

 

tp_550_logo.png Homologação ACBr Apresenta:
Nova  Impressora
TP-550

botao_saibamais.png

 

 

Curso Dominando o ACBrMonitor
Novo Módulo Soluções de Varejo
Assine o SAC ACBr em qualquer plano e tenha acesso

Saiba Mais

Balança SM100 performance surpreendente

Tecnologia Japonesa   Teclado e Visor resistentes a água
Consumo inteligente de etiquetas   Baixo custo de manutenção
Comunicação Ethernet e WIFI independentes

Saiba Mais

Impressora de Etiquetas ELGIN - L42 PRO

Protocolos PPLA, PPLB, ZPL, EPL (automático)
Porta USB padrão Opcionais: Ethernet, Serial, Paralela
Sensor de Etiquetas Móvel Garantia de 18 meses

Saiba mais

Recommended Posts

Boa noite,

Ao tentar instalar o ACBr utilizando o instalador (ACBrInstall_Trunk2) em um Windows Server 2012 R2 (estando conectado através de remote desktop) dá um erro no fim da instalação dizendo que o diretório de sistema não foi encontrado. Depois de fazer algumas buscas na internet entendi o porquê:

"With Terminal Services, the GetSystemWindowsDirectory function retrieves the path of the system Windows directory, while the GetWindowsDirectory function retrieves the path of a Windows directory that is private for each user. On a single-user system, GetSystemWindowsDirectory is the same as GetWindowsDirectory."

E é o que acontece aqui comigo, ao invés de retornar "C:\Windows" a função GetWindowsDirectory retorna "C:\Users\<usuario>\WINDOWS".

A solução é bem simples e consiste em setar uma flag no arquivo DPR do projeto.

{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE}

Estou encaminhando em anexo o arquivo corrigido para que o repositório possa ser atualizado.

E peço desculpas se estou postando no local errado, não encontrei nada específico para o instalador.

ACBrInstall_Trunk2.dpr

  • Like 2

Share this post


Link to post
Share on other sites
16 horas atrás, Ronaldo Negreiros Daniel disse:

E é o que acontece aqui comigo, ao invés de retornar "C:\Windows" a função GetWindowsDirectory retorna "C:\Users\<usuario>\WINDOWS".

A solução é bem simples e consiste em setar uma flag no arquivo DPR do projeto.

{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE}

Estou encaminhando em anexo o arquivo corrigido para que o repositório possa ser atualizado.

E peço desculpas se estou postando no local errado, não encontrei nada específico para o instalador.

Olá Ronaldo,

   Acho que precisamos verificar essa situação com mais cautela. De acordo com a documentação da Microsoft, o ACBrInstall não parece ser compatível com essa flag.

   Vejas as exigências na documentação:

Citar

If your application meets the following criteria, you can safely use the IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE flag.

  • The application does not use .ini files.
  • The application does not write to HKEY_CURRENT_USER during setup. For more information, see Storing User-Specific Information.
  • The application does not run as a system service (that is, LUID=System).
  • The application does not expect exclusive access to the Windows or other system directories. This means that the application does not store per user temporary or configuration data in the Windows or other system directories.
  • The application does not write to the HKEY Local Machine registry hive for user specific data or configuration.
  • The application follows other Remote Desktop Services compatibility guidelines mentioned in this document.

O primeiro ponto (não usar arquivos .ini) já é suficiente para que o ACBrInstall não se enquadre nas aplicações que podem usar de forma segura o flag mencionado.


[]'s

Consultor SAC ACBr

Elton
Ajude o Projeto ACBr crescer - Assine o SAC

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.

Share this post


Link to post
Share on other sites

Boa tarde Elton,

Sim eu vi esse detalhe e no entanto mesmo assim a aplicação funcionou corretamente lendo/gravando o arquivo INI e recuperando corretamente o local da pasta Windows.

Uma outra alternativa seria modernizar a chamada da API pois GetWindowsDirectory/SHGetFolderPath não funcionarão nesse caso.

O que pode-se tentar fazer somente nesse caso (pois há como detectar se o aplicativo está sendo executado em ambiente de terminal) seria ler a variável de ambiente WINDIR.

Vou enviar uma outra versão com o código alterado para que possam verificar se a solução é melhor.

Share this post


Link to post
Share on other sites

Boa tarde,

Segue em anexo outras 2 possíveis soluções para o problema e nesse caso a unit alterada é a ACBrInstallUtils.pas

Em ambos os arquivos a função alterada foi a "PathSystem".

Em anexo está:

ACBrInstallUtils.Solucao1.pas - Nesse arquivo foi alterado a chamada da API GetWindowsDirectory para a GetSystemWindowsDirectory que conforme documentação da Microsoft retorna a pasta correta em ambos os casos (sistema single-user ou multi-user):

"With Terminal Services, the GetSystemWindowsDirectory function retrieves the path of the system Windows directory, while the GetWindowsDirectory function retrieves the path of a Windows directory that is private for each user. On a single-user system, GetSystemWindowsDirectory is the same as GetWindowsDirectory."

Fonte: https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsystemwindowsdirectoryw

ACBrInstallUtils.Solucao2.pas - Nesse arquivo foi incluída uma nova função chamada IsRemoteSession que retorna se a aplicação está rodando em uma sessão de terminal server e caso afirmativo a pasta Windows é retornada através da variável de Ambiente "WINDIR".

Acredito que essas alterações são melhores do que a postada anteriormente.

 

ACBrInstallUtils.Solucao1.pas ACBrInstallUtils.Solucao2.pas

Edited by Ronaldo Negreiros Daniel
  • Like 2

Share this post


Link to post
Share on other sites
Em 16/03/2020 at 14:20, Ronaldo Negreiros Daniel disse:

Boa tarde,

Segue em anexo outras 2 possíveis soluções para o problema e nesse caso a unit alterada é a ACBrInstallUtils.pas

Em ambos os arquivos a função alterada foi a "PathSystem".

Em anexo está:

ACBrInstallUtils.Solucao1.pas - Nesse arquivo foi alterado a chamada da API GetWindowsDirectory para a GetSystemWindowsDirectory que conforme documentação da Microsoft retorna a pasta correta em ambos os casos (sistema single-user ou multi-user):

"With Terminal Services, the GetSystemWindowsDirectory function retrieves the path of the system Windows directory, while the GetWindowsDirectory function retrieves the path of a Windows directory that is private for each user. On a single-user system, GetSystemWindowsDirectory is the same as GetWindowsDirectory."

Fonte: https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsystemwindowsdirectoryw

ACBrInstallUtils.Solucao2.pas - Nesse arquivo foi incluída uma nova função chamada IsRemoteSession que retorna se a aplicação está rodando em uma sessão de terminal server e caso afirmativo a pasta Windows é retornada através da variável de Ambiente "WINDIR".

Acredito que essas alterações são melhores do que a postada anteriormente.

 

ACBrInstallUtils.Solucao1.pas 10 kB · 1 download ACBrInstallUtils.Solucao2.pas 10 kB · 1 download

Muito obrigado pela contribuição.
Fiz a implementação baseada na "Solucao1".
Subi as alterações para o SVN na Revisão  19527.
Pelo que vi está tudo certo.
Queira por favor atualizar, testar e reportar qualquer problema.

Mais uma vez obrigado.

  • Thanks 1

[]'s

Consultor SAC ACBr

Elton
Ajude o Projeto ACBr crescer - Assine o SAC

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.

Share this post


Link to post
Share on other sites

Obrigado por reportar.

Fechando. Para novas dúvidas, criar um novo tópico.


Consultora SAC ACBr

Juliana Tamizou
Ajude o Projeto ACBr crescer - Assine o SAC

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

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

×
×
  • Create New...