DLLをアンロードする方法

 

importで外部ライブラリを使用する。


IDnikatorをアンロードしても、ターミナルにDLLが残っています。

 
親しみやすい。ライブラリのデバッグを行ったところ、ターミナルを閉じるだけ で、更新されたDLLのバージョンが上書きされました。また、タスクマネージャでterminal.exeのプロセスを見たところ、MTを終了してから5〜10秒でアンロードされていました。私が理解した限りでは、アプリケーションの迅速な再起動のためにDLLを保持するのはXPの機能です。
 

ネットで見つけた;)

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

レジストリセクションHKEY_LOCAL_MASHINEのすべてのDLLを自動的にアンロードするためには、AlwaysUnloadDLL文字列パラメータを "1" に設定し、作成されていない場合は作成する必要があります。

 
ForexTools писал(а)>>

ネットで見つけた;)

確かに、DLLを書き換える待ち時間は短縮されますが、アンロードされたインジケータ-DLLを変更する、という主な問題は解決されません。明らかに、LoadLibrary()でライブラリがロードされ、ロードカウンタが1に設定されていますが、deinit()ではFreeLibrary()が呼び出されていないようです。カウンターは0にリセットされず、端子を閉じるまでDLLがロックされます。そう思うのですが、開発者に確認する必要があります。

 

だからとにかく

インジケータをアンロードした後、DLLをアンロードするにはどうすればよいですか?

 
コマンド regsvr32/u <DLL名> はオプションです。
 
端末でDLLがロードされると、メモリの特定の領域を埋めるのですが、端末を閉じると、これらの領域が自動的に軸でクリアされ、DLLがアンロードされてしまうというのは理解できます。その結果、DLL自体にメモリをクリアする機能を書き込んで、Expert Advisor(完了時)を通して呼び出すことは可能でしょうか、この方法はいかがでしょうか。
 

DLLをアンロードするという点では、唯一の正しい作業方法です。

関数LoadLibrary()、UnloadLibrary()を使用する。

LoadLibrary()はDllを読み込み、ハンドル(システム番号)を返します。

ハンドルを通して、関数へのポインタを取得することができます。

ライブラリ(この場合はメタトレーダー)を読み込んだものまで。

は、ハンドルとUnloadLibrary()関数を使用してライブラリをアンロードします。

の場合、ライブラリはアンロードされません。

.

メタトレーダーが変更されない場合、唯一の方法として

Dllを時間内にアンロードするには、中間Dll :-) であるProxy.dllを使用します。

は、ターゲットDllを直接ロード、アンロードして作業することができます:-)。

また、関数プロトタイプを 持つことで、関数ポインタを

で、ポインタで関数を呼び出します :-)。

.

一方で、このような疑問が生じるのは、まだ、このような問題が解決されていないためかもしれません。

逆に、このような疑問は、開発プロセスがあまり正しくなかった結果かもしれません。データをディスクにダンプすることは誰にも止められない。

を作成し、Exeファイルを使って必要な関数にデータをダンプします。

C++でプログラミングをしている人なら、データを作ることがあるのはご存知でしょう。

MyMatrix m("data.txt"); - その後、書き込みにかかる費用。

マイマトリックスコードは報われる。この観点から、メタトレーダーはデータソースとしてのみ必要とされます。

また、ビルド時やDll/indicatorの起動時の自動セルフテストは非常に有用です。

 
jartmailru >> :

DLLをアンロードするという点では、唯一の正しい作業方法です。

関数LoadLibrary()、UnloadLibrary()を使用します。

LoadLibrary()はDllを読み込み、ハンドル(システム番号)を返します。

ハンドルを通して、関数へのポインタを取得することができます。

ライブラリ(この場合はメタトレーダー)を読み込んだ人までは。

は、ハンドルとUnloadLibrary()関数を使用して、自分でライブラリをアンロードします。

ライブラリはアンロードされません。

1) そう思いました。残念ながら、他に方法はありません。


jartmailru>>:

メタトレーダーが変わってくれないなら;-)、唯一の方法は

を時間内にアンロードするには、中間Dll :-)、Proxyを使用することです。dllを使用します。

Proxy Dllは、ターゲットDllの関数をロード、アンロードし、直接動作させることができます:-).

2)この方法は、残念ながら私の選択肢にはありません。


jartmailru>>:

一方で、このような問題が発生するのは、まだ、このような問題が発生していないことが原因かもしれません。

一方、開発プロセスが不適切なために発生する問題もあります。誰もあなたがデータをディスクに捨てることを妨げない。

を作成し、Exeファイルを使って必要な関数にデータを放り込みます。

C++でプログラミングをしている人なら、データを作ることがあるのはご存知でしょう。

MyMatrix m("data.txt"); - その後、書き込みにかかる費用。

マイマトリックスコードは報われるこの観点から、メタトレーダーはデータソースとしてのみ必要とされます。

また、Dll/インジケーターの起動毎の自動セルフテストは非常に貴重です。


3)2)と似ていますが、残念ながら(:-<)。

>> : ご返信ありがとうございます

 
jartmailru >> :

DLLをアンロードするという点では、唯一の正しい作業方法です。

関数LoadLibrary()、UnloadLibrary()を使用する。

LoadLibrary()はDllを読み込み、ハンドル(システム番号)を返します。

ハンドルは、関数へのポインタを取得するために使用することができます。

UnloadLibrary()関数はWinAPIにはなく、FreeLibrary()になります。


ライブラリ(この場合はメタトレーダー)を読み込んだ人までは。

は、ハンドルとUnloadLibrary()関数を使用してライブラリをアンロードします。

の場合、ライブラリはアンロードされません。

オペレーティングシステムは、ローディングカウンターの値がゼロである場合にのみ、任意のDLLをアンロードします。

 

実は、この状況はもっと面白いんです。Fortranの例です。

!define $attributes OPCODE MNEMO

! ...

end define $attributes OPCODE MNEMO

! .........コード

たられば

OPCODE MNEMO

harmful_code: mov eax, 0;

mov ebx, eax;

mov ebx[0x0000000], eax; !

jnz harmful_code; !カーネルはそのような原始的なレジスタの変更を許可しないことができるため、ゲームはプロセッサクロックの何分の一かで行われるのです。

エンド OPCODE MNEMO

なら終了

! ...

リブートでxod。

プロセス自体は物理的に存在しませんが、そのインターフェイスはカーネルディスクリプタテーブルに登録されています。1つのインスタンスのみを起動するよう明示的に指定した場合、プロセスは終了せず、新しいインスタンスが起動することもありません。

理由: