Comando milagroso para redução de memória Delphi

Caros colegas da comunidade Delphi, sabe quando realiza aquela descoberta e implementa aquela solução que você estava buscando a muito tempo? se você é programador deve saber, o que é poder dormir com aquele sentimento de realização, por poder implementar uma grande solução.

Hoje eu quero compartilhar um comando milagroso para aplicações Delphi 7… Não efetuei testes com versões superiores do Delphi mas pela arquitetura imagino que este problema também ocorre até com as versões mais recentes do Delphi. (conforme diversos comentários, esta solução se aplica as versões mais recentes do Delphi)

Quando você cria uma aplicação Delphi, tudo é um objeto, o Formulário é um objeto,  cada objeto ocupa um espaço da memória gerenciado pelo programa após ser instanciado. E todo objeto após ser utilizado deve ser destruído para que esta memória seja liberada…

O que a maioria dos programadores não sabem é que, especificamente em Delphi que não existe “Coletor de Lixo de memória” como na plataforma .NET. Existe uma memória residual que nunca é liberada mesmo que você destrua todos os objetos que instanciar, porque é uma parta da memória que é administrada pelo próprio Sistema operacional. Se você  deixar o seu aplicativo aberto, e efetuar diversas ações que interajam com as APIs do Windows ou DLL externas, trabalhar multi-camadas através de sockets…. Ou mesmo fazer movimentos simples como  minimizar ou maximizar sua aplicação… Você perceberá que memória reservada no gerenciador de tarefas para o processo do seu executável crescerá. E muitos destes movimentos como maximiza e minimizar, exceções como já postei em posts anteriores é a parte não gerenciável da memória de sua aplicação pois ela ocorre na própria interação do Sistema Operacional com sua aplicação.

Desta maneira, sofríamos um problema sério na empresa onde trabalho, pois existem diversas aplicações que rodam como serviços, exemplo:

Servidor de Aplicação Multi-camadas

Serviços de webservices, para integrações com sistemas web

Serviços de webservices para geração de relatórios ReportBuild (PDFs) compartilhados com outras aplicações web (java e .NET).

E o problema comum em todas estas aplicações era o mesmo, por mais que todos os objetes estivessem sendo liberados da memória, esta memória não parava de crescer… Devido ao escopo de memória não gerenciável que falei anteriormente.

E isso gerava um grande transtorno, pois estas aplicações de 3 megabytes chegavam a alcançar 2 giga de memória do servidor, obrigando a reinicialização da aplicação periodicamente.

Fazia-se necessário que a aplicação Delphi localiza-se o processo do Windows e libera-se toda a memória não mais necessária, descartável….

E é aí que descobrir o procedimento milagroso que interage com a API do Windows… para liberar a memória do aplicativa. Este comando é fantástico.

procedure TrimAppMemorySize;
var
MainHandle : THandle;
begin
try
MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID) ;
SetProcessWorkingSetSize(MainHandle, $FFFFFFFF, $FFFFFFFF) ;
CloseHandle(MainHandle) ;
except
end;
Application.ProcessMessages;
end;

Este procedimento localiza o processo da aplicação, e limpa toda memória residual…

E como existe muita pouca documentação desta solução em português… decidi postar aqui.

Se sua aplicação for um Serviço, dll ou algo parecido basta remover a instrução Application.ProcessMessages;

Quem quiser se aprofundar no assunto pode ler o artigo do link abaixo:

http://delphi.about.com/od/windowsshellapi/ss/setprocessworkingsetsize-delphi-program-memory-optimize.htm

155 thoughts on “Comando milagroso para redução de memória Delphi

  1. Estava com um serviço que acumulava memória do servidor e acabava travando a máquina… de um dia para o outro chegava a ocupar mais de 1 Gb de memória. Tinha até criado uma tarefa no windows para reiniciá-lo a cada 15 minutos. Após usar o “comando milagroso” o uso de memória não passa de 400 kb.

    Valeu mesmo pela dica.

      • Pois é… Testei ele no windows 7, e blz, reduz certinho… Mas no Server 2003 a memória sempre cresce (um problema na minha aplicação) e não reduz como no 7. Tenho que procurar outro método de liberar a memória da minha aplicação…

  2. Agnaldo o comando funcionou. Porem parcialmente quando compilo no modo release ele nao funciona. Ou seja a memoria continua crescendo. Alguem tem alguma sugestao? Pq funcionaria somente em modo Debug?
    Cheers!

  3. Caramba cara, este procedimento realmente é milagroso hehe….

    Como meu Aplicativo fica rodando o tempo todo, ele consumia memória demais, tinha feito de tudo já, o máximo que aconteceu foi aumentar o tempo com ele funcionando, mas sempre dava erro e tinha que reinicia-lo, algo que eu n podia fazer sem estar em casa.

    Agora assim que ele começa a se elevar, vem este procedimento e acaba com a “onda” dele kkkk.

    Muito bom mesmo cara, parabéns, e agora passo a ser leitor do seu site.

    OBRIGADOOOOO!!

    • Diogo, eu incluo este comando ao final de um procedimento que pode aumentar a memória da aplicação!As vezes dependendo da aplicação eu declaro o procedimento dentro do escopo local do próprio procedimento que estou invocando o método! isso quando não preciso utiliza-lo em nenhum outro lugar da aplicação!

  4. Agnaldo, muitíssimo obrigado! Resolveu um grande problema que estava acontecendo num “gerenciador automático”, que criei para um cliente. Estava numa luta interminável com o MemCheck, que também me ajudou bastante a encontrar “free’s faltantes”, mas a economia de memória estava sendo muito pequena. Essa rotina “quebrou uma floresta”, heim…. Valeu!

    • Etou utilizando no delphi xe6 também, uma pergunta, só diminui a partir de um determinado tamanho de memória? se não precisar não diminui? tenho um programa que faz várias conexões com o Idhttp criado em run time, destruo todos com freeandnil mas mesmo assim a memoria vai crescendo até travar a aplicação..

    • Marcos de que forma vc utilizou? Estamos com o delphi XE8 e sentimentos uma queda de performance considerável em relação do delphi 7, qualquer dica eu agradeço!

  5. Parabéns, e obrigado pela disposição de compartilhar informação. Eu só lamento que demorei quase dois anos para descobrir. Eu já tinha começado a reescrever código, na tentativa de deixar o aplicativo mais leve. Além do fato que é aplicativo fiscal; tem que esperar resposta de porta serial, etc… valeu mesmo. Senti a diferença já na primeria execução. Sucesso para voce.

    • Olá Edison, em comentários anteriores se bem me recordo, alguém também se queixou de dificuldades em 64 bits, se conseguir a solução não deixe de postar aqui. Deu uma lida no artigo original em inglês.

      • Então eu li, mas não encontrei nada relevante nele, vou pesquisar aqui, pois estou tendo alguns outros problemas além deste da memória ao rodar a mesma aplicação em 64 bits, outra coisa, o debug não funciona tb, somente em 32 bits, acho que pode ser algum problema causado por mim. Se encontrar a resposta eu publico aqui. De qualquer maneira a função é realmente muito boa e vai me ajudar muito. Obrigado pela atenção e sucesso.

  6. Excelente dica, comando milagroso mesmo, resolveu um problemao meu, 6 meses batendo cabeça com “out of memory” e agora o .exe nao passa dos 400k. obrigado pela dica.

  7. Caro Agnaldo:
    Fiz teste em
    win7/32 bits com XE3 ok
    win7/64 bits com XE3 ok
    win2003 com Delphi7 ok

    Em todos os testes diminuiu o uso da memória, o interessante é que em todos esses sistemas, sempre tive o cuidado de destruir o que foi criado, mas mesmo assim o uso de memória crescia, com o código que você gentilmente nos mostrou a memória chega em níveis que nunca consegui.
    Um forte abraço.

  8. Realmente uma função que realmente limpa a memória. Nunca havia conseguido resultados tão evidentes. Nos executáveis que testei houve uma redução de cerca de 95% do uso de memória.
    Muito Obrigado.

  9. No delphi7 Não funcionou, OpenProcess para a frente, acusa que não existe.
    há alguma unit que devo declarar ou acrescentar para funcionar?
    Sofro muito com outofmemory, tenho um programa de migração de dados que trabalha com conexão com bancos

    • Alex para Delphi XE6 a função OpenProcess pertence a unit Winapi.windows
      para Delphi 7 esta função pertence a unit windows, que é declarada desta maneira

      function OpenProcess; external kernel32 name ‘OpenProcess’;

  10. Boas… Agnaldo.
    Deixo meu muito obrigado pela sua valiosíssima contribuição, que ajudou a vida de muitas pessoas e acredito que esta ainda vai ajudar muitas outras. Tenho que fazer alguns testes em plataformas diferentes, mas a princípio estou utilizando em um serviço desenvolvido em C++ Builder XE6 com Win7. Se encontrar algo em novos testes de mereça ser postado, com certeza o farei. Estou prevendo que vai resolver outros grandes problemas que possuímos em módulos de sistemas da empresa onde trabalho.
    Segue a linha que serve para programadores C++:

    SetProcessWorkingSetSize(GetCurrentProcess(), DWORD(-1), DWORD(-1));

    Um grande abraço.

  11. Caraca, muito bom! Meu programa que uso um WebBrowser estava consumindo 150MB de memoria, agora usa uns 7MB e vai subindo rsrsr, mas preciso ficar liberando memoria sempre para evitar que dê lag kkk .. muito bom!

  12. Muito boa a dica.
    Parabéns.

    Estava procurando uma forma de executar unloadpackage em pacotes (BPL) que possuem retorno de dados para aplicação principal e sempre ocorre um erro de memória. Não encontrei solução para o problema, mas com essa dica, basta executar a limpeza após a utilização do pacote.
    Acompanhei o recurso de memória utilizada pela aplicação no gerenciador de tarefas do windows e o resultado é impressionante.

    Alguém teve o problema que eu tive e resolveu de outra maneira?

    Obrigado.

  13. Agnaldo se meu sistema funcionar normal com essa dica sua você me deu uma ajuda enorme não sabia mais oque fazer para ele parar de travar, e agora nos primeiros testes ta reduzindo muito a memoria e tá liso.
    Valeu.

  14. Bom, realmente o comando funciona perfeitamente. Observando o uso da memória pelo gerenciador ele limpa , só que quando faço uma requisição a memória volta alta e acumulativa. Seria dessa forma ? Ou deveria zerar e recomeçar?

  15. Amigo de fato esse procedimento/classe é milagroso (rsrsrsrssr). Desenvolvi uma aplicação para digitralizar documentos (GED), ma medida que ia digitalizando e criando os componentes images em tempo de execução a aplicação alocava cada vez mais memória. A partir de uma quantidade X de documentos digitalizados, quando clicava no botão digitalizar para requisitar o serviço da API do Scanner, simplesmente a requisição parava de responder e as páginas digitalizadas eras perdidas, pois para reiniciar o sistema somente com CTRL+ALT+DEL. Agora com o procedimento o problema simplesmente acabou. Os usuários estão felizes da vida, não precisam mais chamar a área de TI para ver o que está acontencendo com o sistema. Valeu mesmo pela dica.

  16. Testei em uma aplicação o método, dentro de um timer, e realmente o que utilizava em média 40 MB, e crescia conforme era utilizado, chegando a até 100 MB, caiu para menos de 10 MB. Mas gostaria dr uma explicação melhor de o que faz o método, e como faz? No que a execução desses comando impacta na aplicação e no windows. Quando é recomendado usar? A aplicação em questão não reporta mais leaks. Utilizou o madexcept.

  17. Realmente funciona, estou utilizando delphi 2007, consumo facilmente passa de 100mb…200mb..300mb até 1gb quando trava, o comando faz voltar a 7mb. Muito obrigado pela dica.

  18. Caraca mano…. Meu sistema tava torrando 80mb de memória só com o form principal aberto, depois que rodei o comando, putz…. o trem caiu pra 5mb….. uso XE2… o comando é realmente milagroso…. :0)

  19. Bom compilando em debug 32bit windows 7 64bit funciona
    compliando em debug 64bit windows 7 64bit não funciona

    Vi em alguns posts que funcionou pra alguns, alguém sabe o “detalhe” que falta para funcionar tanto com 32bit e 64bit?

    Obrigado!

  20. Olá Agnaldo fazendo teste realmente há a redução de memória porém apenas a memória física já a memoria virtual continua crescendo você já presenciou isso?
    utilizo delphi7 e a aplicação faz carregamento dinâmico de pacotes;

  21. Uma ótima dica, agora é inventar uma estratégia para usar, coloquei no evento create de um formulario que faco heranca e ficou ótimo. Valeu Agnaldo.

  22. Depois de tantos elogios, dispensa comentários..
    Testei com D7 e WinXP, se mostrou eficiente.
    Coloquei na Procedure que cria os formulários.

    Procedure CriaExibeForm(FormClass: ……
    begin
    TrimAppMemorySize;
    // antes de criar o formulário
    CriaFormulario;
    ……
    end;

    Zucchi

  23. Boa noite, embora o meu problema saia do contesto, pois não encontrei nada a respeito em lugar algum. Estou quebrando a cabeça em tentar exibir PDF no win8, sem êxito. No XP e no Win7 funciona perfeitamente, tentei com WebBrowser do TWebBrowser, com OleContainer e com o ActiveX e nada… Se alguém tiver uma resposta agradeço, pois percebo que esse grupo é atuante e são expert em Delphi.
    Atenciosamente,

    Zucchi

  24. Muito bom comando, ajudou muito.

    Testei com Delphi XE2 na minha aplicação e reduziu bastante o uso de memória.

    Gostaria de saber se posso replicar seu comando no meu blog com referencia no seu post.

    Obrigado.

  25. Caro Agnaldo, quero parabenizar e agradecê-lo por esta dica fantástica e importantíssima, pouco difundida.

    Sou desenvolvedor de um software que possui muitos arquivos executáveis com funções específicas. Num dos principais, que é um Serviço, eu enfrentava este problema de aumento inexplicável de memória. Em cerca de 24 horas ela passava de 20Mb para cerca de 150Mb e não parava de crescer. Imagina cerca de 600 máquinas enviando dezenas de requisições a este serviço por minuto, com gravação em banco, etc! Tive que criar um mecanismo interno que reiniciava a aplicação ao atingir 500Mb, o que ocorria a cada 4 ou 5 dias. Não era leak, pois já havia vasculhado e testado todas as rotinas, usado FastMM4. Resumindo, era muito frustrante ter que conviver com isso.

    Esse função da API do Windows que você compartilhou conosco resolveu tudo. Todos os meus aplicativos rodando nos meus clientes reduziram drasticamente a utilização da memória e agora fica estável (no caso do meu serviço principal em cerca de 18Mb). Faço uma chamada a esta função a cada um minuto, sem nenhum problema.

    Uso-a de uma forma mais simplificada:

    SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);

    Valeu mesmo.

    • Para compartilhar esta função, foi que criei este blog José Eduardo, e é disparadamente o artigo mais visitado do meu blog desde a sua criação. Fico muito contente em saber que está agregando soluções em diversas aplicações.

  26. Testei no Windows 10 64 bits, minha aplicação estava alocando 10,6 mb, após usar o comando cai para 0,9 mb. Testado e aprovado. Muito obrigado por compartilhar.

  27. Agnaldo, realmente muito obrigado!
    Esse comando funciona perfeitamente nas minhas aplicações windows, porém, estou tendo problemas com iOS e Android. Minha aplicação fecha do nada depois de algumas operações por causa do uso de memória. Eu gostaria de saber se alguém sabe como ir limpando a memória em iOS pelo Delphi para não dar esse Out of Memory. Se souber, por favor me envie um e-mail para fernando2@xpointsolucoes.com.br

  28. Testado e aprovado com Delphi XE.
    Meu caso usei dentro de um timer que de tempo em tempo executa o procedimento.

    Um detalhe. Tenho uma thread no meu sistema e para que a memória da thread também seja liberada é preciso chamar o procedimento da thread também.

    • Caro Edmar, sua pergunta é difícil de responder, por esta razão escrevi este artigo,mas você pode observar no artigo eu postei o link para um artigo original em inglês com maiores detalhes

    • Tudo depende da sua solução, se você está falando de uma aplicação desktop, pode colocar dentro do oncreate do formulário. Este comando na verdade é uma grande solução para aplicações que rodam sem serem fechadas….

  29. Li o artigo e achei interessante. Mas existem coisas nas aplicações que temos que analisar antes de partir para uma solução como esta. Por exemplo, tentar isolar os pontos de maior consumo de memória. Esses pontos podem ser uma query muito pesada que retorne uma quantidade grande de dados num dataset, verificar se TODO dataset após o uso está sendo fechado, verificar se REALMENTE todos os objetos estão sendo liberados (o que é difícil de acreditar que sim numa aplicação grande) e verificarmos se existe “memory leak” nos componentes mais utilizados nos pontos que isoladamente apresentam crescimento exagerado de memória. Ou seja, é ideal levarmos em conta que o gerenciamento de memória do sistema operacional é melhor feito pelo sistema operacional do que por nós mesmos e SEMPRE descobrir a causa raíz do problema para verificar se temos acesso à solução, mesmo que implique em alterar o código fonte de um componente.

    Alguns colegas citam o uso desta solução em aplicações servidoras e/ou multicamadas, porém é importante deixar claro que o uso desta API do Windows não garante que a solicitação de “trim” da memória será realizada com sucesso pois o próprio sistema operacional realiza as avaliações de casos de necessidade crítica de memória e realiza a redução dos working sets.

    O uso indiscriminado dessa API pode causar um uso excessivo de disco devido à necessidade de repaginação de uma quantidade grande de dados e pode levar ao crash de outros processos.

    Segue documentação da Microsoft:
    https://msdn.microsoft.com/pt-br/library/windows/desktop/ms686234(v=vs.85).aspx

    Abraço a todos

    • Juliano, estou aprovando seu comentário, com a ressalva que na prática este comando ainda é muito mais solução do que problema, em aplicações que rodam como serviço.Realmente não é indicado para aplicações que não enfrentam crescimento ilimitado de memória. Ou seja aquelas aplicações que precisam rodar com alta disponibilidade 24hs por dia; este artigo tem salvado a vida de muita gente, empresas e soluções corporativas tem se beneficiado desta solução. Achei suas considerações válidas também, principalmente a leitura e compreensão da API pela documentação da microsoft.

  30. Entendo e reforço: se uma aplicação é desenvolvida como serviço win32 e está passando por estes problemas, significa que a responsabilidade ainda é maior para o desenvolvedor. Logo, vale a pena isolar o ponto da aplicação/serviço que está enfrentando este problema e em último caso a utilização de soluções como esta.

    Assim, investiga-se para descobrir-se a causa do problema em primeiro lugar e não simplesmente encobre-se o problema que pode ser a simples falta de fechamento de um dataset.

    Avaliem bem !

    Abraço a todos !

    Juliano

  31. esse código é o bicho! otimiza e muito!

    acabei de utilizar ele em delphi 2010 e funciona perfeitamente.. para quem quiser utilizar timer.. é so seguir os passos do link enviado pelo Agnaldo!

    obrigado me ajudou muito

    diego

  32. Só ouço boas notícias desse post… mas confesso que não sei como utilizar. Tenho alguns projetos em clientes de diversos seguimentos mas meu conhecimento foi autodidata. Se alguém puder me dizer onde e em qual momento posso inserir em minhas aplicações ficaria muito grato e estudaria mais o assunto. ABRAÇO

  33. Utilizei o comando em minha aplicação no Lazarus.

    Funcionou perfeitamente, tenho um serviço q apos 1 semana chagava a 1gb de memoria em servidor (2003,2008,2012) e funcionou certinho sem precisar nenhuma adaptação.

    Obrigado

  34. Prezado Sr.
    Agnaldo Carmo

    Em minha aplicação estou utilizando o FastMM4. Acha que é possível utilizar a rotina que o Sr. nos exibiu acima em conjunto com o FastMM4?

    Grato por sua atenção

  35. Agnaldo,
    Não sei se o problema do crash do Delphi 7 no windows 10 se deve ao acúmulo de memória ou não.
    Mas coloquei uma chamada desta função no on idle do application manager e o uso da memória fica reduzida a cada momento de espera do sistema.
    Fiquei impressionado com a diferença.
    abraços

  36. Me ajudou bastante, coloquei em uma Trhead ou em uma chama através de um chamado pelo componente TTimer a cada 10 minutos.
    Ficou constante em média ocupando 1Mb ao invés de 48Mb inicial.
    Obrigado pela dica!

  37. Se abrir o processexplorer, ou process hacker, continua mostrando a mesma quantidade de memoria em private bytes, no gerenciador de memoria do windows mostra uma quantidade bem reduzida, o que nos faz crer que embore limpe a memoria e no gerenciador do windows acuse isso, a memoria continua reservada para a aplicacao,

    • Wilton, isso não explica o fato de que esta rotina vem resolvendo o problema de crescimento de memória de aplicações que rodam como serviço

  38. CARA MILAGROSO ESSE SEU SCRIPT!! EU TENHO UM SERVICE QUE RECEBE CENTENAS DE CONEXÕES VIA UDP A CADA 15 SEGUNDOS, ELE COMEÇAVA COM 250KB E NO FINAL DE 1 DIA TAVA COM QUASE 1GB, NUNCA TINHA CONSEGUIDO RESOLVER ISSO, ESSA ROTINA ACABOU COM O PROBLEMA. VALEU MESMO IRMÃO POR COMPARTILHAR.

  39. Simplesmente Fantástico
    Minha Aplicação ocupava 210 MB de RAM
    ao rodar o comando baixou pra 2 MB, ISSO MESMO QUE LERAM, 2 MEGA BITS!!!

    Show de bola……

  40. Ola Agnaldo.
    Tenho uma aplicacao desenvolvida em Delphi 2005 que sofre do mesmo problema.
    Sabe me dizer se funciona nesta versao tambem ?
    Quais os namespaces necessários !?

    • Alessandra, tenho vários feedbacks de que esta instrução funciona para versões inferiores e superiores a 2005, então é muito provável que irá funcionar sim. Se bem me lembro não será necessária a adição de nenhuma unit adicional…

      • Agnaldo, implementei ontem, a princípio parece que está surtindo efeito.
        Nossa aplicação é um ASP .NET Web Application desenvolvida em Delphi 2005 .
        Apenas removi o Application.ProcessMessages.
        Grata pela sua atenção.

        • Legal, Alessandra, grato pelo feedback… o application.ProcessMessages, só se aplica a aplicações win32 (desktop), esta solução eu descobri porque tínhamos um problema em uma aplicação web, na época era um serviço, dll isapi, no IIS( Internet Information Service), e também na ocasião tive que remover o application.ProcessMessages

  41. Sim, reduz a memória. Mas não faz milagre de sumir com os memory leaks (ou faz?).

    Então é bom continuar procurando os leaks. Meu servidor (em desenvolvimento) baixou de 5.9mb pra 800kb

  42. Cara, que procedure do capitoro é essa uasheuhasuehhuase.
    Sempre me preocupei em limpar todas as instâncias de objetos, forms, etc. após finalizar todo processo e sinceramente achava que não havia maneiras de melhorar o consumo de memória.
    To usando o XE7 e essa rotina reduziu simplesmente cerca de 90% do consumo.
    Cara muito obrigado mesmo! Ajudou pra caramba!

  43. Na verdade esse comando não limpa a memória de nada :(, o que ele faz é swapping da memória virtual para o disco e isso vai deixar sua aplicação muitooo lenta. Basicamente ele poem tudo que tá na memoria virtual no disco e depois começa a alocar memória virtual de novo. Problema, sua velocidade de acesso a ram cai pra velocidade do seu disco, mesmo tendo um SSD a diferença é grande, mas se for um HD ….. Aí fica carroça ( lógico que isso vai ser perceptível sistemas que exigam bastante processamento).
    Esse negócio de memória ter leak com interação com o Windows ? De onde saiu isso ?

    • Olá Rodrigo, este commando milagroso a que me refiro tem sim se demonstrado eficaz em aplicações que rodam como serviço 24horas dia/7 dias semana e que tendem com o passar dos meses a travar por super utilização de memória (memory overhead utilization). Nestes cenários e apenas nestes cenários este commando tem sim não apenas reduzido a utilização de memória da aplicação, como também fez com que as aplicações não mais sofressem reinicialização.
      Gostaria de ter mais detalhes do seu cenário para compreender melhor porque esta solução não se aplica

  44. Amigos, passeando pela madruga, esbarrei no post mto bom por sinal…

    Eu uso como serviço e resolvi o problema no 2003 configurando para rodar o serviço como Administrador…. Segundo a Microsoft, este recurso requer direitos Administrativos. Pra quem nao saber, Abrir a tela de serviço, localize seu Programa, Boatao Direito, Propriedades, e coloca ali a conta de Adminsitrador e senha que vai funcionar.

    O meu serviço de 25 Mb agora roda liso com 0,3

    @RodrigoFariasRezino, da uma lida no link abaixo meu velho… (se n souber ingles joga no tradutor do Google)

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms686234.aspx

    @Agnaldo, parabéns pela dica, ajudou a todos, menos o @Rodrigo hahaha

Deixe um comentário

Translate »