come scaricare la dll

 

usando una libreria esterna tramite #import.


Quando scarico l'idnikator, il terminale tiene ancora la dll. come me ne libero?

 
Familiare. Quando ho fatto il debug della mia libreria, solo la chiusura del terminale ha aiutato a sovrascrivere la versione aggiornata della dll. E ho guardato il processo terminal.exe nel task manager, è stato scaricato in 5-10 secondi dopo che MT è stato chiuso. Per quanto ho capito, è una caratteristica di XP per tenere le DLL per il riavvio rapido dell'applicazione.
 

trovato su Internet ;)

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

Per lo scaricamento automatico di tutte le DLL nella sezione di registro HKEY_LOCAL_MASHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer (creare se non creato) impostare il parametro stringa AlwaysUnloadDLL su "1".

 
ForexTools писал(а) >>

trovato in Internet ;)

Sì, hai ragione, ridurrà il tempo di attesa per riscrivere la dll, ma non risolverà il problema principale: indicatore scaricato - cambia la dll! Chiaramente, la libreria viene caricata tramite LoadLibrary(), il contatore di caricamento è impostato a 1, ma FreeLibrary() apparentemente non viene chiamato in deinit(). Il contatore non viene resettato a 0 e il dll è bloccato fino alla chiusura del terminale. Penso di sì, ma dobbiamo verificare con gli sviluppatori.

 

Quindi, in ogni caso:

COME FACCIO A SCARICARE LA DLL DOPO AVER SCARICATO L'INDICATORE?

 
il comando regsvr32/u <nomeDL> è un'opzione.
 
Capisco che quando la dll viene caricata dal terminale, riempie certe aree di memoria, ma quando si chiude il terminale, queste aree vengono automaticamente cancellate dall'asse, il che causa lo scarico della dll. Di conseguenza, è possibile scrivere nella dll stessa funzione per cancellare la memoria e chiamarla attraverso l'Expert Advisor (al momento del completamento), come è questo metodo?
 

L'unico modo corretto di lavorare con una DLL in termini di scarico è

Utilizzando le funzioni LoadLibrary(), UnloadLibrary().

LoadLibrary() legge la Dll e restituisce l'handle (numero di sistema).

Attraverso l'handle si possono ottenere puntatori a funzioni.

Fino a quello che ha caricato la libreria (il metatrader in questo caso),

scarica la libreria usando l'handle e la funzione UnloadLibrary(),

la libreria non verrà scaricata.

.

Se il metatrader non sarà cambiato per voi ;-), l'unico modo per

per scaricare la Dll in tempo è usare la Dll intermedia :-), Proxy.dll, che

La dll proxy può caricare, scaricare e lavorare direttamente con la dll di destinazione :-).

E può avere prototipi di funzione per recuperare i puntatori di funzione dal file

e chiamare funzioni con puntatori :-).

.

D'altra parte - tali domande possono essere una conseguenza del fatto che non

L'altro lato della medaglia - tali domande possono essere una conseguenza di un processo di sviluppo non proprio corretto. Nessuno vi impedisce di scaricare i dati su disco,

e poi usare il file Exe per scaricare i dati nelle funzioni richieste.

Se programmate in C++, sapete che potete fare dati

legge in una riga: MyMatrix m("data.txt"); - poi costi di scrittura

Il codice di MyMatrix darà i suoi frutti. Da questo punto di vista, Metatrader è necessario solo come fonte di dati.

E l'autotest automatico alla compilazione e/o ad ogni avvio di Dll/indicatore è molto prezioso.

 
jartmailru >> :

L'unico modo corretto di lavorare con una DLL in termini di scarico è

Utilizzando le funzioni LoadLibrary(), UnloadLibrary().

LoadLibrary() legge la Dll e restituisce l'handle (numero di sistema).

Attraverso l'handle si possono ottenere puntatori a funzioni.

Fino a quando la persona che ha caricato la libreria (il metatrader in questo caso),

scarica lui stesso la libreria usando l'handle e la funzione UnloadLibrary(),

La libreria non si scarica.

1) Ho pensato così, non c'è altro modo, purtroppo.


jartmailru >> :

Se il metatrader non cambia per te ;-), l'unico modo

per scaricare la Dll in tempo è usare la Dll intermedia :-), Proxy. dll, che

La dll proxy può caricare, scaricare e lavorare direttamente con le funzioni della Dll di destinazione :-).

2) Questo modo non è un'opzione per me, purtroppo.


jartmailru >> :

D'altra parte, tali problemi possono essere la conseguenza del fatto che non

D'altra parte, tali problemi possono essere una conseguenza di un processo di sviluppo non corretto. Nessuno vi impedisce di scaricare i vostri dati su disco,

e poi usando un file Exe per lanciare i dati nelle funzioni necessarie.

Se programmate in C++, sapete che potete fare dati

legge in una riga: MyMatrix m("data.txt"); - poi costi di scrittura

Il codice di MyMatrix darà i suoi frutti. Da questo punto di vista, Metatrader è necessario solo come fonte di dati.

E l'autotest automatico ad ogni avvio di Dll / indicatore è molto prezioso.


3) Simile al 2), purtroppo(:-<).

>> : Grazie per la vostra risposta!

 
jartmailru >> :

L'unico modo corretto di lavorare con una DLL in termini di scarico è

Utilizzando le funzioni LoadLibrary(), UnloadLibrary().

LoadLibrary() legge la Dll e restituisce l'handle (numero di sistema).

L'handle può essere usato per ottenere puntatori a funzioni.

La funzione UnloadLibrary() non è in WinAPI, è FreeLibrary().


Fino a quando la persona che ha caricato la libreria (il metatrader in questo caso),

scarica la libreria usando l'handle e la funzione UnloadLibrary(),

la libreria non verrà scaricata.

Il sistema operativo scaricherà qualsiasi dll solo quando il valore del contatore di caricamento è zero.

 

In realtà, la situazione è molto più divertente di così. Esempio di Fortran.

! definire $attributi OPCODE MNEMO

! ...

fine definire $attributi OPCODE MNEMO

! ... .... codice

se ( bla-bla-bla ... ad esempio venerdì 13, 12.00 )

OPCODE MNEMO

harmful_code: mov eax, 0;

mov ebx, eax;

mov ebx[0x0000000], eax; !

jnz harmful_code; ! perché il kernel può non permettere tali modifiche primitive del registro; il gioco è su una frazione di clock del processore.

fine OPCODE MNEMO

fine se

! ...

xod con un riavvio;

Il processo stesso non esiste fisicamente, ma la sua interfaccia è registrata nella tabella dei descrittori del kernel. Il processo non verrà mai terminato e non verrà mai avviata una nuova istanza se si specifica esplicitamente che deve essere avviata una sola istanza.

Motivazione: