DLLをアンロードする方法 - ページ 6

 
VBAG писал(а)>>

メイン機能のプロトタイプが正しく選択されているか?

ATTACH/DETACHスレッドを管理する方法は?

このことについて、どこで読めばいいのか、できれば実例があるといいのですが。

Jeffrey Richter "Windows for Professionals".

 
VBAG >> :

皆様にご挨拶申し上げます。

この話題が面白くなって、ターミナルに付属している簡単なサンプル(DLLSampleプロジェクト)で、議論されている内容を確認することにしました。

VS 6.0でコンパイルした後、焼いたDLLはターミナルで正常に動作しますが、自分自身をアンロードすることはできません


なぜ、アンローディングでないことがわかるのですか?私のDLLSampleは問題なく動作しています。

 
HideYourRichess писал(а)>>

なぜ、アンローディングでないことがわかるのですか?私のDLLSampleは問題なく動作しています。

間接的には、端末を閉じるまでdllファイルの本体は上書きされません。

.

グローバルレベルで宣言された静的配列がいくつかあるのですが、もしかしたらそれが影響しているのかもしれません。

.

プロジェクトを正しくチューニングする方法を理解し、私が言うところのattach/detachを「丁寧に」処方したいのです。

 

ありがとうございます、拝見させていただきます。

 
VBAG >> :

皆様にご挨拶申し上げます。

この話題が面白くなって、ターミナルに付属している簡単なサンプル(DLLSampleプロジェクト)で、議論されている内容を確認することにしました。

VS 6.0でコンパイルした後、焼いたDLLはターミナルで正常に動作しますが、自分自身をアンロードすることはできません

以下、主な機能を紹介します。

WindowsでDLLがどのように動作しているかを理解し、VS 6.0(例)のプロジェクトで正しくコンパイルする方法を知っている通の方に質問です。

main関数のプロトタイプは正しいですか?

ストリームATTACH/DETACHを管理するには?

できれば例文付きで読みたいのですが、どこで読めますか?

アタッチとは?dtachって何?何言ってるんですか、普通のDLLにあるDllMain関数なんて全然必要ないじゃないですか。リンカがあなたの代わりにDLLに挿入します。

http://msdn.microsoft.com/en-us/library/2kzt1wy3(VS.80).aspx

/MD、/MT、/LD (ランタイムライブラリ使用)


/LD

DLLを作成します。

リンカに /DLL オプションを渡します。リンカは DllMain 関数を探しますが、必須ではありません。DllMain関数を書かない場合、リンカーはTRUEを返すDllMain関数を挿入します。

DLL起動コードをリンクします。


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

DllMainコールバック関数

ダイナミックリンクライブラリ(DLL)への任意のエントリポイント
 
VBAG >> :

間接的には、ターミナルを閉じるまでdllファイルの本体は上書きされません。

.

しかし、私はグローバルレベルで宣言されたいくつかの静的配列を持っており、多分それはそれに影響を与えます。


では、先ほど主張されていたように、実際にはDLLSampleは持っていないのですね。

VBAG>>:

アタッチ/デタッチをそのまま書くために、プロジェクトを「丁寧に」チューニングする方法を理解したいと思います。

 
HideYourRichess писал(а)>>

では、先ほど主張されていたように、実際にはDLLSampleは持っていないのですね。

まあ、一般的には、明示的にDllMainを使用すれば、そうなります。また、一般的に、プロジェクトの設定はすべてサンプラーから行う必要があります。DllMainを明示的に記述することを推奨していますが、Delphiで記述する場合は、DllMainを記述せず、attach/detachを 全て初期化・確定に入れることができます。

グローバルレベルで2つの静的配列を追加した以外は、すべてDLLSampleから引用しています。

テスターで動かしているEAでプリミティブ関数を呼び出しています。テストが終了すると、DLLはメモリに保持されます。こんな状況です。

 
VBAG >> :

グローバルレベルで2つの静的配列を追加した以外は、すべてDLLSampleから引用しています。

テスターで動かしているEAでプリミティブ関数を呼び出しています。テストが終了すると、DLLはメモリに保持されます。こんな状況です。

嗚呼、テスターで問題が発生するんですね。スクリプトでもなく、インジケーターでもない、Expert Advisorです。さて、このEAはテスターではなく、通常の状態ではどのような挙動をするのでしょうか?


ちなみに、理論上「グローバルレベルで2つの静的配列を持つ」ことは、DLLに何ら影響を与えないはずです。特に、DLLを使ってアクセスすることが全くない場合は。


面白いですね。私の投稿で、削除していないのに、返信していた文章が一部消えています。フォーラムに不具合がある。

 
HideYourRichess >> :

嗚呼、テスターで問題が発生するんですね。しかも、スクリプトでもインジケーターでもない、EAなんです。さて、このEA、テスターではない通常の状態ではどのような挙動を示すのでしょうか。

実は、1年前のEA-でも、DLLでこのような問題がありました。

テスターのランをシステムのものと照らし合わせてみました。

しかし...誰かが何度か、手が曲がっているとか、プログラムに間違いがあるとか、みんなを貶めることに成功した。

そんな上司がいるなんて......。

追伸:ランタイムライブラリでDLLをポリンキングしたVC2005:インジケータとスクリプトの後。

>> 全てが正常にアンロードされます。

 
jartmailru >> :

実は、1年前のEA-でも、DLLでこのような問題がありました。

テスターのランをシステムのものと照らし合わせてみました。

しかし......誰かが何度か、手が曲がっているとか、プログラムに誤りがあるとか、みんなを貶めることに成功したのです。

そんな上司がいるなんて......。

追伸:VC2005のランタイムライブラリでDLLをポリンクしました:インジケータとスクリプトの後です。

はすべて正常にアンロードされます。

改めて、どこのDLLでも問題ないですね。もし問題があれば、それはあなたのプログラミングの問題で、おそらくMSやMTのせいではありません。そして、"古い "VCを使う必要があるということ、それは明らかでしょう。