DllMainでCreateThread

と書いたら複数の指摘をもらった。しかし理解できなかったので聞き返したが反応が無い。ただの屑鉄のようだ。そのままスレが落ちてしまったので回答欲しさに引っ張ってみる。


以下その流れ。846が私です。

846:>>826
    >>830が正しい
    普通はロードされても機能しないように実装すればOKだと思う
    どうしてもというのならDllMainでCreateThreadしてその中でFreeLibraryAndExitThreadを撃てばアンロードはされる
    ただし、フックでロードしたDLLをFreeLibraryするという事実がどう影響するかは知らない

848:> DllMainでCreateThreadして
    > DllMainでCreateThreadして
    > DllMainでCreateThreadして

849:DLLMainではやっちゃいけない事が色々あってだな

852:DllMainでCreateThreadとかフックDLLをFreeLibraryとか言っちゃうゆとり世代はWin95で開発してみればいいと思うw

    てかXPSP2とかVISTAとかで自作ソフトが誤動作してキレるのって大抵そういう輩だからなー

858:846
    番号振るのでうzって人はNGしてください
    DllMainでCreateThreadがまずいのは、
    1.DllMainはシリアライズされる
    2.CreateThreadはDllMainが制御を返さないと完全に開始しない(これはDisableThreadLibraryCallsを事前に使っていても同じ)
    3.なのでDllMainで2.のスレッドでWaitするとデッドロックする
    これがひとつ、拙い原因なのは解りました。

    もうひとつがたぶん、
    >アタッチの際、開発者が作成した DLL エントリポイント関数の本体は、スレッドローカル記憶域(TLS)の作成、
    >オブジェクトの作成、ファイルのオープンなど単純な初期化作業だけを行うべきです。
    のくだりで、その根拠としてLoadLibraryの問題を挙げているのですが、これは
    >システムが自らの初期化コードを実行する前に使われる DLL で、このような不適切な呼び出しが発生する可能性があります。
    のとあるので、フックのように動的にリンクされるDLLは当てはまらないのではないですか?

やっちゃいけないこと、というのが良く判らないまま、ここで一連のレスは終了。ひどい、生殺しだよ orz

リンク方法に関係なくダメなのかなぁ? その根拠は? そもそもMSDNにある「オブジェクト作成」=カーネルオブジェクト作成の意図であれば、スレッドはカーネルオブジェクトなので問題ないような気がするんですが、どうなんでしょう。教えてください>識者の方