2011-11-14 26 views
10

Vì vậy, tôi đang gặp phải một vấn đề rất lạ với ứng dụng thử nghiệm nhỏ của tôi. Và theo vấn đề, tôi có nghĩa là nó bị treo ... cứng. Không có ngoại lệ (ít nhất, không có gì mà tôi có thể nắm bắt) được ném ra, chỉ là "Blah Blah đã ngừng đáp ứng ..." tin nhắn. Nó treo CHỈ khi tôi chạy ứng dụng ở x64, chế độ phát hành và bên ngoài IDE. Nếu tôi chạy nó trong chế độ x86, hoặc nếu tôi chạy nó trong IDE trong x64 hoặc tôi chạy nó độc lập như DEBUG trong x64 nó hoạt động tốt.Sự cố với ứng dụng .NET 4.0 x64 ở chế độ Phát hành bên ngoài IDE chỉ

Tôi đã thu hẹp nó xuống p/gọi lệnh PeekMessage của tôi. Vì vậy, tôi cần những tâm trí tuyệt vời ở đây để nhìn vào crap tôi đã viết và cho tôi biết nếu tôi làm đúng. Bởi vì, nghiêm túc, tôi sắp mất trí óc vua **. Tôi đã thử điều này trên 2 máy tính và cả hai đều thể hiện cùng một hành vi. Tôi hơi lo ngại rằng đây có thể là lỗi .NET 4.0.

Dù sao, đây là mã p/gọi của tôi. Xin vui lòng cho tôi biết nếu bạn thấy bất cứ điều gì kỳ lạ hoặc chỉ đơn giản ngu ngốc:

Đây là lời kêu gọi PeekMessage:

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

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

Dưới đây là PeekMessage (Chú ý: Thuộc tính an ninh đàn áp là vào định nghĩa lớp, vì vậy nó đang được ứng dụng):

[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); 

đây là 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; 
} 

Và cuối cùng, 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 
} 

Tôi đã kiểm tra các bản ghi sự kiện và tôi nhận điều này:

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 

Vì vậy, nếu bạn thấy bất cứ điều gì không hoàn toàn đúng, xin vui lòng cho tôi biết. Tôi ghét điều này không phải là lỗi của tôi.

Xin lỗi nếu nó không đủ chi tiết, nếu bạn cần thêm thông tin, chỉ cần để lại một ghi chú.

+1

Tôi có các sự cố tương tự với ngay cả các thông số sai nhỏ nhất, đặc biệt là các chuỗi (Unicode so với Ansi, v.v.) [Trang này] (http://www.pinvoke.net/default.aspx/user32.peekmessage) liệt kê một sự khác biệt chữ ký cho 'PeekMessage'. Tôi đề nghị bạn thử nhiều người khác cho đến khi bạn tìm thấy một tác phẩm. –

+2

Là một lưu ý ngẫu nhiên, nếu bạn gặp sự cố khi gỡ lỗi điều này, điều đó gây ra ngoại lệ. Giả sử bạn có thể tải chương trình của bạn sau khi bạn xây dựng nó, bạn có thể chạy nó. Sau đó, studio trực quan thông thường đính kèm để xử lý và bạn sẽ có thể gỡ lỗi nó ngay cả trong chế độ phát hành miễn là các PDB với nó. Sau đó, bạn có thể bật break trên bất kỳ ngoại lệ ném (CTRL + ALT + E) và bạn có lẽ sẽ nhận được rất nhiều thông tin. –

+0

Vâng, tôi đã cân nhắc thực hiện điều đó, nhưng nó đã bị loại trừ ngay lập tức, vì vậy không có thời gian để đính kèm. Bây giờ tôi nhận ra rằng tôi có thể đã thêm một sự chậm trễ 'Sleep' trước 'PeekMessage', nhưng đã nửa đêm và tôi hầu như không thể hình thành những câu mạch lạc, nên nó không xảy ra với tôi vào lúc đó. – Mike

Trả lời

6

Kích thước của các trường lParamwParam của MSG là sai. Bạn nên sử dụng IntPtr thay vì uint/int.

Nếu bạn có một cái nhìn tại Windows Data Types bạn có thể thấy rằng:

  • LPARAM là một LONG_PTR ví dụ: 32 bit của nó về kích thước của các nền tảng 32 bit và 64 bit có kích thước trên nền tảng 64 bit.
  • PARAM là một UINT_PTR kích thước 32 bit kích thước 32 bit và kích thước 64 bit trên nền tảng 64 bit.

Ngược lại các intuint loại đều 32 bit có kích thước không phụ thuộc vào nền tảng, có nghĩa là trên nền tảng 64 bit MSG struct của bạn là 64 bit quá nhỏ sẽ dẫn đến một số loại tham nhũng bộ nhớ.

+2

Vâng, tôi chỉ thấy điều này sau khi Uwe Keim đề nghị tôi ghé thăm pinvoke.net. Tôi đã làm điều đó tối qua. Tôi đã thay đổi nó thành 'IntPtr' và nó hoạt động như một sự quyến rũ. Cảm ơn cả hai. – Mike

Các vấn đề liên quan