DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ウィンドウプロシージャを追加したらエラーとなってしまいます

環境/言語:[Windows2000、C#、.NET Framework1.1]
分類:[.NET]

お世話になります。
C#でWindowsアプリケーションを開発しております。

起動時のメインフォームにウィンドウプロシージャを追加しました。

protected override void WndProc(ref Message m)
{
  // 処理
}

で、ネットワーク上にEXEを置いて実行してみると、
JustInTimeのデバッガ選択画面が表示されるようになってしまいました。
今までは起動出来ないことをメッセージボックスで表示出来ていました。
(コードアクセスセキュリティで起動出来ない事は問題ありません。)
上記コードをコメントアウトするとデバッガ画面は表示されずに、
こちらの意図した動きになります。
(もちろんローカル上では問題なく動きます。)

何が原因となっているのでしょうか?
対処法等ございましたらご教授宜しくお願いします。
■No15231に返信(おおにたさんの記事)

//処理

の中に

base.WndProc(ref m);

は入っているのでしょうか?
管理人さま 回答ありがとうございます。

>
> base.WndProc(ref m);
>
> は入っているのでしょうか?

はい。入っております。

WndProcの中を全てコメントアウトしたり、
一部をコメントアウトしても発生してしまいます。

いろいろ試してみておりましたが、
WndProcをOverrideすることによってExceptionが発生しているみたいです。
overrideしなければ発生しません。

でもoverrideしないと意味がありませんし・・・。

解決策が見つからず苦慮しております。。。
どうぞ宜しくお願い致します。
■No15239に返信(おおにたさんの記事)
> WndProcの中を全てコメントアウトしたり、

これに関しては「基底メソッドの呼び出し」がないということになるので、明らかにダメでしょう。

> いろいろ試してみておりましたが、
> WndProcをOverrideすることによってExceptionが発生しているみたいです。
> overrideしなければ発生しません。

つまり、以下のコードと、

protected override void WndProc(ref Message m) {
  base WndProc(m)
}

こちらのコメントアウトした場合とで、

//protected override void WndProc(ref Message m) {
//  base WndProc(m)
//}

結果が異なると仰るのでしょうか?
ちょっと考えられないですね。

.................................................
じゃんぬ - Microsoft MVP for Visual Developer C#
  http://jeanne.wankuma.com/
  http://blogs.wankuma.com/jeanne/
じゃんぬねっと様 回答ありがとうとざいます。

> こちらのコメントアウトした場合とで、
>
> //protected override void WndProc(ref Message m) {
> //  base WndProc(m)
> //}
>
> 結果が異なると仰るのでしょうか?

はい。WndProcを外せばSecurityのExceptionは発生しませんでした。
試しに新規にWindowsアプリケーションのプロジェクトを作成し、
protected override void WndProc(ref Message m) {
 base WndProc(m)
}
上記のWndProcを追加した場合でも同様の現象が発生しました。

処理的には意味はなくなりますが、
protected void WndProc(ref Message m) {
 base WndProc(m)
}
とoverrideを外せば例外は発生しませんでした。

> ちょっと考えられないですね。

という事は試している環境が特殊な環境という事なのでしょうか・・。
ちなみにExeを配置しているネットワーク上の環境ですが、
Windows2000で、.NET Frameworkはインストールされている環境と
インストールされていない環境の2つを試しましたが結果は同じでした。
すいません。少し文章が正しくなかったので訂正させて下さい。

WndProcを外した場合と外さなかった場合でもExceptionは発生するのですが、
外さなかった場合については、デバッガ選択画面が出てきてしまう。
というのが正しい内容となります。
■No15243に返信(おおにたさんの記事)
> WndProcを外した場合と外さなかった場合でもExceptionは発生するのですが、

まずこれがダメだから。
根本的に何が問題なのかわかってらっしゃらないごようす。

#今になって誇らしげに言われても・・・
> まずこれがダメだから。
> 根本的に何が問題なのかわかってらっしゃらないごようす。

だから質問している次第です。
何か問題ある?

> #今になって誇らしげに言われても・・・

そんなに誇らしげに言われても・・・
■No15243に返信(おおにたさんの記事)
> WndProcを外した場合と外さなかった場合でもExceptionは発生するのですが、

どのような例外が発生するのでしょうか?
私も、ここはここで問題だと思います。
むしろ、ここが問題かもしれません。

> 外さなかった場合については、デバッガ選択画面が出てきてしまう。
> というのが正しい内容となります。

再度確認になってしまい恐縮なのですが、外さなかった場合でも、
base.WndProc(m) の 1 行は必ず通っていますよね?

デバッガ選択画面が出るということは、アタッチできないような場所で例外が起きているような気がします。
もう少し詳細な情報をください。

................................................................................................
じゃんぬ - Microsoft MVP for Visual Developer C#
  http://jeanne.wankuma.com/
  http://blogs.wankuma.com/jeanne/
じゃんぬねっと様 回答ありがとうございます。

WndProcがあると以下のExceptionが発生します。
=========================
'System.Security.SecurityException' のハンドルされていない例外が 不明なモジュールです。 で発生しました。

追加情報 : 種類 System.Security.Permissions.SecurityPermission, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 のアクセス許可の要求に失敗しました。
=========================

> 再度確認になってしまい恐縮なのですが、外さなかった場合でも、
> base.WndProc(m) の 1 行は必ず通っていますよね?

WndProcがある場合は、アプリケーションのメインエントリポイントの
Application.Run(new Form1());にブレイクポイントを置いても、
入ってくれません。
それ以前に落ちているみたいです。
WndProcが無いコードですと、上記のApplication.RunでExceptionが発生します。
ですのでbase.WndProc(m)には通っておりません。

ローカルPC以外の場所からEXEを実行しようとしているから、
SecurityExceptionが発生しているのはわかるのですが、
何故WndProcがあるとApplication.Runに入る前に落ちるのかが理解出来ておりません。。
>で、ネットワーク上にEXEを置いて実行してみると、
>JustInTimeのデバッガ選択画面が表示されるようになってしまいました。

.NETのデフォルトのセキュリティ設定ではネットワーク上のプログラムを実行できません。

.NETアプリケーションを配布するにはさまざまな方法がありますが、一番お手軽で簡単なのは働いているセキュリティ制限を緩めることです。

イントラネットの場合やり方は以下のとおりです。
「管理ツール」→「Microsoft .NET Framework1.1 ウィザード」→「セキュリティの変更」→イントラネットの信頼レベルを「完全な信頼」にする。

DOBON.NET | プログラミング道 | プログラミング掲示板