> なんとなくですが・・・書いてること矛盾してません?
> というのは現実的に、再入可能なように設計する ≒ 再入禁止措置
> なような気がするんです。
> ごくごく一部の単純な、すごーく短いハンドラならともかく・・・
> 普通にソフト作る場合のほとんどのハンドラは再入禁止措置しか私には
> 解が思いつきません・・・orz
うーーむ、
もともと、ShellExecuteExはexeファイルを何回も実行させる目的では作られていない
と思います。
本来の使い方は、エクセル・ワードみたいにDDE 通信が可能なアプリケーションを
一つ立ち上げて、DDE 通信を行いながら何かを行う。なのかなぁーと思います。
>ShellExecuteExをCreateProccess/Exで置き換える
これは正解だと思います。
ただ、ハンドル等はメインスレッドで管理するのがいいと思います。
すみません、ITOです。
仲澤さん、ITOさんいろいろ解説ありがとうございます。
> BeginPaint()から制御が「戻る前」にWM_ERASEBKGNDメッセージが、自身に届きます。
私は知らなかったですw。参考になります。
ただこれはWM_ERASEBKGNDしか届かないのでは?やはりShellExecuteExがDDE以外のメッ
セージを処理するのはなんか変(バグ)じゃないのかな~と私はちょっと思います・・・
ーーー
あと解決策なんですが1つ書き忘れていました。今回は別スレッドを立ち上げることは無
いためほぼシングルスレッドみたいなもので、現在のグローバル変数のカウンタ方式でも
一応解決します。
ただWM_DROPFILESにはカウンタのフィルタをかけてないので、極稀にWM_DROPFILESが
ShellExecuteから呼ばれるとダメかも(←不思議なのはこれが発生しないのです。かなり
回数テストしましたが、WM_TIMERしか通過していないように見えます。厳密にテストした
わけじゃないので自信がないのですが・・・)
ここまで書いてみてもしかしてSetTimerで使っているIDが重複しているのでは?と思い、
IDを1200 -> 12000に変えたら直るんじゃと試してみたけどやっぱりダメでしたw
あと1つ注釈しておくと、ShellExecuteEx(5回め)で必ず発生するとのことでしたが、こ
れは間違いでした。厳密にいうと私のPCでは必ず5回目に発生します。なのでみなさんの
高速なPCだと8回目だったり発生しないこともあるかも。SetTimerの値を10やもっと小さ
くすれば発生するかと思います。