como descarregar a dll

 

usando uma biblioteca externa via #import.


Quando eu descarrego o idnikator, o terminal ainda mantém a dll. como eu me livro dele?

 
Familiar. Quando eu depurei minha biblioteca, apenas o fechamento do terminal ajudou a sobrescrever a versão dll atualizada. E observei o processo terminal.exe no gerenciador de tarefas, ele foi descarregado em 5-10 segundos depois que a MT foi fechada. Tanto quanto eu entendi, é um recurso XP para segurar dlls para reiniciar rapidamente a aplicação.
 

encontrado na Internet ;)

Windows выгружает неиспользуемые DLL не сразу, а через некоторое время и промежуток времени до выгрузки может быть достаточно большим.

Para descarga automática de todas as DLLs na seção de registro HKEY_LOCAL_MASHINE\SOFTWARE\Microsoft\CurrentVersion\Explorer (criar se não for criado) definir o parâmetro de string AlwaysUnloadDLL para "1".

 
ForexTools писал(а) >>

encontrado na Internet ;)

Sim, você está certo, isso reduzirá o tempo de espera para reescrever a 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 devemos verificar com os desenvolvedores.

 

De qualquer forma:

COMO EU DESCARREGO A DLL APÓS DESCARREGAR O INDICADOR?

 
comando regsvr32/u <DLL name> é uma opção.
 
Entendo que quando a dll é carregada pelo terminal, ela preenche certas áreas de memória, mas quando você fecha o terminal, essas áreas são automaticamente limpas pelo eixo, o que faz com que a dll seja descarregada. Conseqüentemente, é possível escrever na própria função dll para limpar a memória e chamá-la através do Expert Advisor (no momento da conclusão), como é este método?
 

A única maneira correta de trabalhar com uma DLL em termos de descarregamento é

Usando as funções LoadLibrary(), UnloadLibrary().

LoadLibrary() lê o Dll e devolve a alça (número do sistema).

Através do cabo você pode obter indicações de funções.

Até aquele que carregou a biblioteca (o metatarrader, neste caso),

descarrega a biblioteca usando o cabo e a função UnloadLibrary(),

a biblioteca não será descarregada.

.

Se o metatrader não for trocado por você ;-), a única maneira de

para descarregar o Dll no tempo é usar o Dll intermediário :-), Proxy.dll, que

A dll proxy pode carregar, descarregar e trabalhar diretamente com o alvo Dll :-).

E pode ter protótipos de funções para buscar indicadores de funções do

e funções de chamada com apontadores :-).

.

Por outro lado - tais questões podem ser uma consequência de não

Por outro lado - tais questões podem ser uma conseqüência de um processo de desenvolvimento não muito correto. Ninguém está impedindo que você despeje os dados no disco,

e depois usando o Exe-file para despejar os dados nas funções necessárias.

Se você programar em C++, você sabe que pode fazer dados

lê em uma linha: MyMatrix m("data.txt"); - então custos de escrita

O código MyMatrix vai valer a pena. Deste ponto de vista, Metatrader é necessário apenas como uma fonte de dados.

E o autoteste automático na construção e/ou a cada início de Dll/indicador é muito valioso.

 
jartmailru >> :

A única maneira correta de trabalhar com uma DLL em termos de descarregamento é

Usando as funções LoadLibrary(), UnloadLibrary().

LoadLibrary() lê o Dll e devolve a alça (número do sistema).

Através do cabo você pode obter indicações de funções.

Até a pessoa que carregou a biblioteca (neste caso, a metátrapeira),

descarrega a biblioteca ele mesmo usando o cabo e a função UnloadLibrary(),

A biblioteca não será descarregada.

1) Eu pensava assim, não há outra maneira, infelizmente.


jartmailru >> :

Se o metatrader não vai mudar para você ;-), a única maneira

para descarregar o Dll no tempo é usar o Dll intermediário :-), Proxy. dll, que

A dll proxy pode carregar, descarregar e trabalhar diretamente com as funções Dll alvo :-).

2) Infelizmente, esta forma não é uma opção para mim.


jartmailru >> :

Por outro lado, tais questões podem ser a consequência de não

Por outro lado, tais questões podem ser uma conseqüência de um processo de desenvolvimento incorreto. Ninguém impede que você despeje seus dados no disco,

e depois usando um Exe-file para atirar os dados para as funções necessárias.

Se você programar em C++, você sabe que pode fazer dados

lê em uma linha: MyMatrix m("data.txt"); - então custos de escrita

O código MyMatrix vai valer a pena. Deste ponto de vista, Metatrader é necessário apenas como uma fonte de dados.

E o autoteste automático em cada início de Dll / indicador é muito valioso.


3) Similar a 2), infelizmente(:-<).

>> : Obrigado por sua resposta!

 
jartmailru >> :

A única maneira correta de trabalhar com uma DLL em termos de descarregamento é

Usando as funções LoadLibrary(), UnloadLibrary().

LoadLibrary() lê o Dll e devolve a alça (número do sistema).

O cabo pode ser usado para obter indicações sobre as funções.

A função UnloadLibrary() não está no WinAPI, ela é FreeLibrary().


Até a pessoa que carregou a biblioteca (neste caso, a metátrapeira),

descarrega a biblioteca usando o cabo e a função UnloadLibrary(),

a biblioteca não será descarregada.

O sistema operacional descarregará qualquer dll somente quando o valor do contador de carga for zero.

 

Na verdade, a situação é muito mais engraçada do que isso. Exemplo de Fortran.

! definir $attributes OPCODE MNEMO

! ...

! final definir $attributes OPCODE MNEMO

! ... .... código

se ( bla-bla-bla-bla ... por exemplo, sexta-feira 13, 12.00 )

OPCODE MNEMO

harmful_code: mov eax, 0;

mov ebx, eax;

mov ebx[0x0000000], eax; !

jnz harmful_code; ! porque o kernel pode desautorizar tais modificações de registro primitivas; o jogo está em uma fração de um relógio processador.

terminar OPCODE MNEMO

terminar se

! ...

xod com um reboot;

voilá! o processo em si não existe fisicamente, mas sua interface é registrada na tabela de descritores do kernel. O processo nunca será encerrado e uma nova instância nunca será iniciada se você especificar explicitamente que apenas uma instância deve ser iniciada.