como descarregar a dll - página 4

 
OneDepo >> :

Sim, você está certo, isso reduzirá o tempo de espera para a reescrita da dll, mas não resolverá o problema principal: indicador descarregado - mude a dll! Claramente, a biblioteca é carregada via LoadLibrary(), o contador de carga é ajustado para 1, mas a FreeLibrary() aparentemente não é chamada deinit(). O contador não é zerado para 0 e a dll é bloqueada até que o terminal seja fechado. Acho que sim, mas precisamos verificar com os desenvolvedores.

Quem impede (exceto para alguns participantes deste ramo) de fazer

#importar "kernel32.dll".

int GetModuleHandleA ( string sss);
FreeLibrary(int hhh);
#importar


deinit()

{

handlissimo=GetModuleHandleA("test-dll.dll");

FreeLibrary(handlissimo) ;

}


???

Você pode preencher os parâmetros da função por si mesmo. Para excluir TOTALMENTE DA MEMÓRIA todas as DLL liberadas desta forma - devido às limitações do metatrader.exe e devido ao caching forte mencionado anteriormente por mim em vindex (que inclui a substituição de arquivos dll protegidos da dllcache) - use regsvr32.

Vejo que TheExpert está relacionado a MetaQuotes.

 

Nota: às vezes até o regsvr32 não descarrega a DLL, e o Windows preenche uma versão antiga. A prática mostra que uma única DLL pode estar na memória para WEEKS. Neste caso, apenas a reinicialização ajudará. Se você não quiser reiniciar, formas semi-escavadoras ajudarão, como o Process Explorer. Pode descarregar da memória qualquer coisa de qualquer lugar - ao contrário do que os vocacionistas deste fórum afirmam (e carregar também, ha ha, mas você não precisa disso).

http://www.softpedia.com/get/System/System-Info/Process-Explorer.shtml

breve descrição e plugin:

http://rootkits.su/app/ShowApp.aspx?id_a=36

 

Vejo que você ainda está indo a isso. Muito bem. Eis o que a própria EM nos diz sobre a regsvr32:


Ferramenta Regsvr32: uso e mensagens de erro


"A ferramenta Regsvr32 (Regsvr32.exe) é projetada para registrar e não registrar controles OLE, tais como arquivos DLL ou OCX registrados automaticamente. Isto pode ser necessário ao solucionar alguns problemas no sistema Windows, no Microsoft Internet Explorer e em outros programas. Por exemplo, de acordo com o artigo abaixo da Base de Conhecimento da Microsoft, a ferramenta Regsvr32.exe deve ser usada para cancelar o registro do controle Wuv3is.dll antes que ele possa ser reinstalado a partir do site do Windows Update Center.


mais:

"O utilitário regsvr32.exe é usado para registrar DLLs e controles ActiveX no registro do Windows. Ele também pode ser usado para remover inconsistências entre arquivos DLL".

 
HideYourRichess >> :

Vejo que você ainda está indo a isso. Muito bem. Eis o que a própria EM nos diz sobre a regsvr32:


Ferramenta Regsvr32: Mensagens de uso e de erro


"Regsvr32 (Regsvr32.exe) é usado para registrar e não registrar controles OLE como arquivos DLL ou OCX auto-registrados. Isto pode ser necessário ao solucionar alguns problemas no sistema Windows, no Microsoft Internet Explorer e em outros programas. Por exemplo, de acordo com o artigo abaixo da base de conhecimento da Microsoft, a ferramenta Regsvr32.exe deve ser usada para cancelar o registro do controle Wuv3is.dll antes de reinstalá-lo a partir do site do Windows Update Center".


mais:

"O utilitário regsvr32.exe é usado para registrar DLLs e controles ActiveX no registro do Windows. Também pode ser usado para remover inconsistências entre arquivos DLL".

Bem, tio hacker, você já deveria ter adivinhado de sua própria última frase como regsvr32 funciona para nós:


http://support.microsoft.com/kb/207132

RegSvr32.exe chama as seguintes funções Win32 nesta ordem:

* OleInitialize
* LoadLibrary para carregar a DLL
* DllRegisterServer ou DllUnregisterServer
* FreeLibrary
* OleUninitialize

http://msdn.microsoft.com/en-us/library/ms683152(VS.85).aspx
Função FreeLibrary

Libera o módulo carregado da biblioteca de links dinâmicos (DLL) e, se necessário, decreta sua contagem de referência.
Quando a contagem de referência chega a zero, o módulo é descarregado do espaço de endereços da chamada
processo e o cabo não é mais válido.

Ou seja, regsvr32 carrega e libera a biblioteca. Mas ao contrário do terminal.exe, que por si só ou com uma solução simples e elegante que sugeri acima, liberta a biblioteca, MAS CONTINUA A FICAR EM MEMÓRIA, (dando ao Windows razões para não descarregar a biblioteca por enquanto e deixar qualquer outro processo fazê-lo) - ao contrário do metatrader pendurado na memória, o utilitário de linha de comando regsvr32.O utilitário de linha de comando exe ESTOVA seu PROCESSO e EXIT da MEMÓRIA, que instrui o Windows a descarregar completamente a biblioteca da memória.

Uma biblioteca pode ser descarregada sem utilizar regsvr32, mas é a roleta. Algumas pessoas gostam da roleta, a maioria dos profissionais não gosta, é uma questão de nível de desenvolvimento.

Se a biblioteca for simples e não se agarrar a MUITAS outras bibliotecas, ela PODE descarregar rapidamente. Mas se a biblioteca for complexa, habilitada para banco de dados, com controles exóticos, pode levar minutos ou até horas para ser descarregada.

A propósito, em relação ao parâmetro AlwaysUnloadDLL - a própria Microsoft afirma que este só funcionou até 2000 (então e agora aplicava algoritmos complexos para calcular "a necessidade de uma DLL"):

http://msdn.microsoft.com/en-us/library/bb776795(VS.85).aspx

Descarregamento da DLL

A Shell descarrega automaticamente uma DLL quando sua contagem de uso é zero, mas somente após a DLL não ter sido utilizada por um período de tempo. Este período inativo pode ser inaceitavelmente longo às vezes, especialmente quando uma DLL de extensão da Shell está sendo depurada. Para sistemas operacionais anteriores ao Windows 2000, você pode reduzir o período inativo adicionando as seguintes informações ao registro.

  • HKEY_LOCAL_MACHINE
  • Software
  • Microsoft
  • Windows
  • CurrentVersion
  • Explorador
  • AlwaysUnloadDll
 

Como ainda estou sofrendo de um resfriado (mas atenção, mesmo deitado na cama com febre eu ajudo as pessoas a resolver seus problemas terminais.exe de graça, ou seja, resolver seus problemas de dinheiro exclusivamente), posso dizer aos interessados (e também aos estudantes de escolas profissionais desinformados) como é difícil trabalhar como administrador de sistemas em grandes empresas de longa distância.

Qualquer grande empresa utiliza ferramentas UNIVERSAL. Isto significa que todos os servidores - local e global rodam Eorakl, em todas as estações de trabalho utilizam o mesmo programa da mesma versão do linkage Office, Excel- ou programa analítico com Eorakl ou MS SQL Server, alguns "dbconnect.dll". E então um "maravilhoso" dia para os desenvolvedores de sysadmins finalmente depurar uma nova versão do programa e todos os sysadmins locais (na empresa dos primeiros cem - sysadmins pode ser 500-800, 1.250 memória de disco rígido Terabyte, 130 nós NCR, 145 sistemas de servidor Unix e 2600 servidores Windows, 80.000 usuários de correio eletrônico em mais de 2.000 locais corporativos) vem um pedido para SUBSTITUIR "amanhã" este programa. O programa é complexo, usa muitas coisas, basta reescrevê-lo no computador para não funcionar. E é necessário reiniciar o computador após o regsvr32 - se o administrador do sistema tiver tempo para isso.

Nesta substituição só pode ser feita de 18-00 a 24-00, porque até 18-00 funcionários de escritório ainda estão trabalhando em computadores, e às 24-00 no servidor inicia o trabalho de serviço no Yorakla, as estações estão iniciando a atualização automática do Windows e a atualização automática do antivírus. Há meios para REMOTE iniciar regsvr32 e estação de sobrecarga sem ir à estação, mas nem sempre funcionam, (Firewall habilitada, usuário não-logof-lenny, etc.). E os computadores podem estar entre 50 e 100, longe um do outro, em andares diferentes e em escritórios já fechados.

Assim, os administradores de sistemas rodam ao redor do edifício da empresa e executam o regsvr32 à mão.

 

O Regsvr32 foi projetado para registrar e cancelar o registro de servidores COM.

Estes não são todos dlls. Este é um tipo especial de dll. Não há necessidade de ligar para Regsvr32.

É suficiente chamar a FreeLibrary como mostrado acima ou não usar "#importar", mas usar o par:

LoadLibrary, FreeLibrary.

A propósito, minhas dlls são, por alguma razão, liberadas imediatamente após a remoção do indicador.

 

Na verdade, pessoalmente, estou escrevendo para aqueles que sabem ler russo e inglês. Pessoas estranhas, elas repetem pela décima vez aqui PORQUE a regsvr32 foi criada. Eles o cantam como um mantra, como um feitiço, enquanto outros não sabem por quê. E o que importa se regsvr32 faz o que precisamos que faça e não tem efeitos colaterais?

É como uma ambulância ou um médico de terapia intensiva prescrevendo hipossulfito de sódio para um alcoólatra ("avançado" como esse)

http://drugslist.ru/drugs/antichlor-sodium-thiosulfate/

e ele começa a gritar que não vai beber porque ..... é um foto fixador e eles querem envenená-lo!

http://www.rwwc.ru/recipe/index6.php

Se há tantas pessoas inteligentes aqui, então deixe-as apontar OUTRO utilitário padrão, que está à mão em qualquer computador, que carregaria e imediatamente descarregaria QUALQUER BIBLIOTECA que você queira, de modo a reiniciar o cache de DLLs pelo Windows desta forma.

 
AlexEro >> :

...

Pela décima vez eles repetem aqui PORQUE a regsvr32 foi criada. O que importa se regsvr32 faz o que precisamos que faça e não tem efeitos colaterais? Eles o cantam como um mantra, como um feitiço.

É como uma ambulância ou um médico de emergência prescrevendo hipossulfito de sódio para um alcoólatra ("avançado" como esse)

...

Tudo isso é muito importante. Se você está fazendo analogias médicas, o que você está escrevendo aqui é como tratar uma cabeça doente com um machado.


AlexEro >> :

...

O descarregamento da biblioteca pode acontecer SEM usar regsvr32, mas é a roleta. Algumas pessoas gostam da roleta, a maioria dos profissionais não gosta, é uma questão de nível de desenvolvimento.

Se a biblioteca for simples e não se agarrar a MUITAS outras bibliotecas, ela PODE descarregar rapidamente. Mas se a biblioteca for complexa, habilitada para banco de dados, com controles exóticos, pode levar minutos ou até horas para ser descarregada.

...


Você simplesmente não entende como funciona, em princípio, o mecanismo de carga/descarga da dll, é por isso que você tem fantasias tão doentias sobre este assunto. Você não deve usar regsvr32, ele não é destinado a ele. Também não deve tentar descarregar a biblioteca no deinit com a FreeLibrary, a biblioteca deve ser descarregada por ela mesma, se não tiver erros grosseiros, é claro. Sua "solução simples e elegante" é um disparate. Não funcionará em muitos casos, especialmente se houver bloqueios dentro do DllMain.


Repito, a única maneira normal e correta de descarregar uma dll é escrever a própria dll sem erros. Se o dll não for descarregado normalmente - então as mãos do codificador estão tortas (ou seja, o codificador, no próprio terminal tudo é feito corretamente) - isso é tudo. Eu sempre, repito, sempre descarreguei a dll normalmente, imediatamente após a remoção do indicador. E isto é correto, é a forma como foi projetado no terminal.


E você está em vão tentando dar peso à sua ficção, referindo-se à sua experiência como um administrador de sistema. Já descobrimos que você não é um administrador de sistemas muito inteligente, por isso parece muito infantil, ridículo.

 
HideYourRichess >> :
Você simplesmente não entende como o mecanismo de carga/descarga dll funciona em princípio, é por isso que você tem fantasias tão doentias sobre este tópico.... (Você também não deve tentar descarregar uma biblioteca para desativá-la usando a FreeLibrary, a biblioteca deve ser descarregada por ela mesma, se não houver erros grosseiros nela, é claro. Sua "solução simples e elegante" é um disparate. Não funcionará em muitos casos, especialmente se houver bloqueios dentro do DllMain.
Tio hacker, não há lógica em suas palavras: se a biblioteca é SEMPRE descarregada, por que "minha" chamada FreeLibrary de acordo com você "não vai funcionar em muitos casos"? Que mal poderia acontecer com uma chamada extra da FreeLibrary no bloco deinit()? Chamar a FreeLibrary() em sua opinião bloquearia de alguma forma a liberação da biblioteca ou algo assim? Isso não está claro, tio hacker legal, e é óbvio.
 
AlexEro >> :
Tio hacker, não há lógica no que você está dizendo

1ª pergunta - como o sistema sabe de quais processos para descarregar a dll?

Pergunta 2 - como posso encontrar o ponto de entrada sem carregar a dll?


Agora, essencialmente. A dll é carregada e descarregada durante a regsvr para um registro correto. E é claro que isto não tem nenhum efeito sobre o descarregamento de outros processos.

Não tente parecer mais estúpido do que você é. Você pode ler mana, no entanto.

Se a biblioteca SEMPRE descarregou, por que "minha" chamada FreeLibrary de acordo com você "não vai funcionar em muitos casos"? Que mal poderia causar uma chamada extra da FreeLibrary em um bloco deinit()? Talvez sua chamada FreeLibrary() bloqueie de alguma forma a liberação da biblioteca, ou o quê? Tio hacker de lã, e uma clara, por sinal.

É óbvio. Além de descarregar a dll, a implementação da desinicialização do indicador (expert) pode ser qualquer coisa diretamente relacionada a ela, o que transforma a liberação não autorizada da dll em um hack, o que por sua vez não garante o correto funcionamento do terminal.


>> Então, boa sorte, continue tentando.

2Todos: não pense em contratá-lo como administrador.