2011-11-14 10 views
10

私の小さなテストアプリケーションでは非常に奇妙な問題が発生しています。そして問題によって、私はそれがクラッシュすることを意味する...難しい。例外はありません(少なくとも、私が捕まえることはできません)、 "Blah Blahが応答を停止しました..."というメッセージがスローされます。 のアプリを実行すると、x64、リリースモード、およびIDEの外部でアプリが実行されるとクラッシュします。 x86モードで実行した場合、またはx64でIDEで実行した場合、またはx64でDEBUGとしてスタンドアロンで実行すると正常に動作します。IDEの外でリリースモードでx64 .NET 4.0アプリケーションをクラッシュする

私はp/invoke PeekMessageコールに絞り込んだ。だから、私が書いたことを見て、私が正しいことをしているかどうか教えてもらうために、私はここで華麗な心が必要です。真剣に、私は私のf **の王の心を失うことになる。私は2台のコンピュータでこれを試してみましたが、どちらも同じ動作を示します。私はこれが.NET 4.0のバグかもしれないと少しは心配しています。

とにかく、ここにp/invokeコードがあります。あなたが奇数あるいは単なる愚かな何かを見る場合は私に知らせてください:

ここでのPeekMessageへの呼び出しです:抑制のセキュリティ属性は、クラス定義の上にあるので、それはされている:

private static bool PeekMessage() 
{ 
     MSG message = new MSG();    // Message to retrieve. 

     return Win32API.PeekMessage(ref message, IntPtr.Zero, 0, 0, PeekMessageFlags.NoRemove); 
} 

はここでのPeekMessage(NOTEです)適用:

[return: MarshalAs(UnmanagedType.Bool)] 
[DllImport("User32.dll", CharSet=CharSet.Auto)] 
public static extern bool PeekMessage(ref MSG msg, IntPtr hwnd, uint wFilterMin, uint wFilterMax, PeekMessageFlags flags); 

はここでMSGです:

[StructLayout(LayoutKind.Sequential)] 
internal struct MSG 
{ 
     /// <summary>Window handle.</summary> 
     public IntPtr hwnd; 
     /// <summary>Message to process.</summary> 
     public uint Message; 
     /// <summary>Window message parameter 1.</summary> 
     public uint wParam; 
     /// <summary>Window message parameter 2.</summary> 
     public uint lParam; 
     /// <summary>Time message was sent?</summary> 
     public uint time; 
     /// <summary>Mouse pointer position.</summary> 
     public Point pt; 
} 

そして最後に、 PeekMessageFlags:

internal enum PeekMessageFlags 
{ 
     /// <summary>Keep message on the message queue.</summary> 
     NoRemove = 0, 
     /// <summary>Remove message from the queue.</summary> 
     Remove = 1, 
     /// <summary>Do not yield execution to waiting threads.</summary> 
     NoYield = 2 
} 

私は、イベントログをチェックして、私はこれだ:

Faulting application name: Tester_Graphics.exe, version: 1.0.0.0, time stamp: 0x4ec0ba85 
Faulting module name: unknown, version: 0.0.0.0, time stamp: 0x00000000 
Exception code: 0xc0000005 
Fault offset: 0x00000000000001cb 
Faulting process id: 0x1260 
Faulting application start time: 0x01cca299e2c21a77 
Faulting application path: D:\Code\Current\Gorgon\Branches\2.x\Dorian\Examples\Tester_Graphics\bin\Release\Tester_Graphics.exe 
Faulting module path: unknown 
Report Id: 20ac891f-0e8d-11e1-a5d7-bcaec5753ddd 

だから、あなたはかなり右ではない何かを見た場合、私に知らせてくださいと。私はこれが私のせいではないことを嫌っています。

申し訳ありません詳細が不明な場合は、さらに詳しい情報が必要な場合はメモを残してください。

+1

私は、わずかな間違ったパラメータ、特に文字列(UnicodeとAnsiなど)でも同様の問題がありました[このページ](http://www.pinvoke.net/default.aspx/user32.peekmessage) 'PeekMessage'の署名です。私はあなたが作品を見つけるまで、他のものを試してみることをお勧めします。 –

+2

ランダムなメモとして、これをデバッグするのに問題があった場合、例外が発生しました。プログラムをビルドした後にロードできるとすれば、それを実行することができます。その後、通常のビジュアルスタジオをプロセスにアタッチして、PDBがあればリリースモードでもデバッグすることができます。次に、スローされた例外(CTRL + ALT + E)でブレークをオンにすると、おそらくもっと多くの情報が得られるでしょう。 –

+0

ええ、私はそれをやると考えましたが、すぐに例外があったので、添付する時間がありませんでした。 'PeekMessage'の前に' Sleep'ディレイを追加できるようになりましたが、それは真夜中だったので、一貫した文章をほとんど作ることができなかったので、当時私には起こりませんでした。 – Mike

答えて

6

lParamwParamのフィールドのサイズがMSGで間違っています。 uint/intの代わりにIntPtrを使用してください。

あなたはWindows Data Typesを見てみた場合、あなたはそれを見ることができます:

  • LPARAMは、32ビット・プラットフォームおよび64ビット・プラットフォーム上のサイズは64ビットのサイズでLONG_PTRすなわち、その32ビットです。
  • PARAMは、UINT_PTRであり、32ビットプラットフォームのサイズは32ビットであり、64ビットプラットフォームのサイズは64ビットです。

逆にintuint型は64ビットプラットフォーム上であなたのMSG構造体は、メモリ破損のいくつかの並べ替えになりますどの小さすぎる64ビットであることを意味し、プラットフォームに関係なくのサイズの両方で32ビットです。

+2

Uwe Keimが私がpinvoke.netを訪問した後、ちょうどこれを見ました。私は昨夜それをした。私はそれを「IntPtr」に変更し、それは魅力的に機能しました。お互いに感謝します。 – Mike

関連する問題