アクセス違反を作成するGraphics.DrawLineに問題があります。VS2010 /コンピューターの再起動、フレームワークの修復、Windowsの更新、および削除するパッチまたはパッチの種類の検索を試みました。それを取り除くものは何もないようです。MS サイトのサンプルでさえ、エラーでクラッシュします。それを修正するために何を探すべきかわからない。以前は機能していたので、どこかに悪いパッチがあるに違いありません。現在、windows XP で動作しています。
更新 1: API と相互参照するようにコードを更新しました。DrawLineInt はフレームワークを使用し、DrawLineInt2 は API コマンドを使用します。どちらも DrawLine 関数に違反しています。このサンプルを VB6 に投入しても、この問題は発生しません。
更新 2: どうやら、VS スタジオの環境設定が C++ に設定されている場合、このバグは発生しません。設定をリセットして「Visual Basic」に戻すと、このバグが再発します。VS2010 と .NET フレームワークをアンインストール/インストールしても、これを修正することはできませんでした。ビルドされた実行可能ファイルを実行しても実行可能ファイルはクラッシュしませんが、VS がクラッシュする可能性があります...うーん..?
更新 3: 他の描画方法を試し、以下に呼び出しトレースを追加しました。どうやら PEN を使用するメソッドは例外を引き起こしますが、BRUSH を使用するメソッドはそうではありません。copy_32 メソッド内でトレースする場合、描画スペースへのポインターが無効です (0x0 または 0xBAADF00D)。これにより、同じ描画ルーチンを使用するため、GroupBox も役に立たなくなります。
サンプルコード...
Public Class Form1
Public Sub DrawLineInt2(ByVal e As PaintEventArgs)
'Misc
Dim Ret As GpStatus
' Create pen.
Dim blackPen As IntPtr = IntPtr.Zero
Dim blackbrush As IntPtr = IntPtr.Zero
Dim c As Int32 = &HFF000000
Ret = GdipCreateSolidFill(c, blackbrush)
'Ret = GdipCreatePen1(c, 10, GpUnit.UnitPixel, blackPen)
Ret = GdipCreatePen2(blackbrush, 10, GpUnit.UnitPixel, blackPen)
' Create coordinates of points that define line.
Dim x1 As Integer = 100
Dim y1 As Integer = 100
Dim x2 As Integer = 500
Dim y2 As Integer = 125
' Draw line to screen.
Dim graphics As IntPtr = IntPtr.Zero
'Ret = GdipCreateFromHDC(e.Graphics.GetHdc, graphics)
Ret = GdipCreateFromHWND(Me.Handle, graphics)
'System.AccessViolationException here
Ret = GdipDrawLineI(graphics, blackPen, x1, y1, x2, y2)
'Here Also
'Ret = GdipDrawRectangleI(graphics, blackPen, x1, y1, x2, y2)
'Here as well
'Ret = GdipDrawArcI(graphics, blackPen, x1, y1, x2, y2, 15, 20)
'No problems with this line
'Ret = GdipFillRectangleI(graphics, blackbrush, x1, y1, x2, y2)
Ret = GdipDeletePen(blackPen)
Ret = GdipDeleteBrush(blackbrush)
Ret = GdipDeleteGraphics(graphics)
'e.Graphics.ReleaseHdc()
End Sub
Public Sub DrawLineInt(ByVal e As PaintEventArgs)
' Create pen.
Dim blackPen As New Pen(Color.Black, 3)
' Create coordinates of points that define line.
Dim x1 As Integer = 100
Dim y1 As Integer = 100
Dim x2 As Integer = 500
Dim y2 As Integer = 100
' Draw line to screen.
Try
e.Graphics.DrawLine(blackPen, x1, y1, x2, y2)
Catch
End Try
blackPen.Dispose()
End Sub
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
'DrawLineInt(e)
DrawLineInt2(e)
End Sub
Private Enum GpStatus As Int32
Ok = 0
GenericError = 1
InvalidParameter = 2
OutOfMemory = 3
ObjectBusy = 4
InsufficientBuffer = 5
NotImplemented = 6
Win32Error = 7
WrongState = 8
Aborted = 9
FileNotFound = 10
ValueOverflow = 11
AccessDenied = 12
UnknownImageFormat = 13
FontFamilyNotFound = 14
FontStyleNotFound = 15
NotTrueTypeFont = 16
UnsupportedGdiplusVersion = 17
GdiplusNotInitialized = 18
PropertyNotFound = 19
PropertyNotSupported = 20
End Enum
Private Enum GpUnit As Int32 ' aka Unit
UnitWorld ' 0 -- World coordinate (non-physical unit)
UnitDisplay ' 1 -- Variable -- for PageTransform only
UnitPixel ' 2 -- Each unit is one device pixel.
UnitPoint ' 3 -- Each unit is a printer's point, or 1/72 inch.
UnitInch ' 4 -- Each unit is 1 inch.
UnitDocument ' 5 -- Each unit is 1/300 inch.
UnitMillimeter ' 6 -- Each unit is 1 millimeter.
End Enum
Private Declare Function GdipDrawLine Lib "gdiplus.dll" (ByVal graphics As IntPtr, ByVal pen As IntPtr, ByVal x1 As Single, ByVal y1 As Single, ByVal x2 As Single, ByVal y2 As Single) As GpStatus
Private Declare Function GdipDrawLineI Lib "gdiplus.dll" (ByVal graphics As IntPtr, ByVal pen As IntPtr, ByVal x1 As Int32, ByVal y1 As Int32, ByVal x2 As Int32, ByVal y2 As Int32) As GpStatus
Private Declare Function GdipCreatePen1 Lib "gdiplus.dll" (ByVal color As Int32, ByVal Width As Single, ByVal unit As GpUnit, ByRef pen As IntPtr) As GpStatus
Private Declare Function GdipCreatePen2 Lib "gdiplus.dll" (ByVal brush As IntPtr, ByVal Width As Single, ByVal unit As GpUnit, ByRef pen As IntPtr) As GpStatus
Private Declare Function GdipDeletePen Lib "gdiplus.dll" (ByVal pen As Int32) As GpStatus
Private Declare Function GdipCreateSolidFill Lib "gdiplus" (ByVal argb As Int32, ByRef brush As IntPtr) As GpStatus
Private Declare Function GdipDeleteBrush Lib "gdiplus" (ByVal brush As IntPtr) As GpStatus
Private Declare Function GdipFillRectangleI Lib "gdiplus" (ByVal graphics As IntPtr, ByVal brush As IntPtr, ByVal x As Int32, ByVal y As Int32, ByVal Width As Int32, ByVal Height As Int32) As GpStatus
Private Declare Function GdipDrawRectangleI Lib "gdiplus" (ByVal graphics As IntPtr, ByVal pen As IntPtr, ByVal x As Int32, ByVal y As Int32, ByVal Width As Int32, ByVal Height As Int32) As GpStatus
Private Declare Function GdipDrawArcI Lib "gdiplus" (ByVal graphics As IntPtr, ByVal pen As IntPtr, ByVal x As Int32, ByVal y As Int32, ByVal Width As Int32, ByVal Height As Int32, ByVal startAngle As Single, ByVal sweepAngle As Single) As GpStatus
Private Declare Function GdipCreateFromHDC Lib "gdiplus.dll" (ByVal hdc As IntPtr, ByRef graphics As IntPtr) As GpStatus
Private Declare Function GdipCreateFromHWND Lib "gdiplus.dll" (ByVal hwnd As IntPtr, ByRef graphics As IntPtr) As GpStatus
Private Declare Function GdipDeleteGraphics Lib "gdiplus" (ByVal graphics As IntPtr) As GpStatus
クラス終了
例外呼び出しスタック
GdiPlus.dll!ScanOperation::Copy_32() + 0x14 バイト
GdiPlus.dll!EpAlphaBlender::Blend() + 0x58 バイト
GdiPlus.dll!EpScanGdiDci::DrawScanRecords_Dci() + 0x1de バイト
GdiPlus.dll!EpScanGdiDci::ProcessBatch_Dci() + 0x181 バイト GdiPlus.dll!EpScanGdiDci::EmptyBatch() + 0x6b5ab バイト GdiPlus.dll!EpScanGdiDci::End() + 0x1e バイト
GdiPlus.dll!EpScanBufferNative::~EpScanBufferNative() + 0x18 バイト
GdiPlus.dll!DpDriver::StrokePath () + 0x20a バイト
GdiPlus.dll!DriverMulti::StrokePath() + 0x6c バイト GdiPlus.dll!GpGraphics::DrvStrokePath() + 0x2a バイト
GdiPlus.dll!GpGraphics::RenderDrawPath() + 0xa3 バイト
GdiPlus.dll!GpGraphics: :DrawLines() + 0xe8 バイト
GdiPlus.dll!GpGraphics::DrawLine() + 0x45 バイト
GdiPlus.dll!_GdipDrawLine@24() + 0x8e バイト
GdiPlus.dll!_GdipDrawLineI@24() + 0x37 バイト
[外部コード] WindowsApplication2.exe!WindowsApplication2.Form1.DrawLineInt2 (System.Windows.Forms.PaintEventArgs e) 30 行目 + 0x17 バイト Basic
それがドロップする例外...
System.AccessViolationException は処理されませんでした Message=保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています。Source=System.Drawing StackTrace: System.Drawing.SafeNativeMethods.Gdip.GdipDrawLineI(HandleRef グラフィックス、HandleRef ペン、Int32 x1、Int32 y1、Int32 x2、Int32 y2) で System.Drawing.Graphics.DrawLine(ペン ペン、Int32 x1) 、Int32 y1、Int32 x2、Int32 y2) (C:\Documents and Settings\FF\Local Settings\Application Data\Temporary Projects\WindowsApplication1\Form1.vb:line 15 at WindowsApplication1.Form1.DrawLineInt(PaintEventArgs e)) にあります。 System.Windows.Forms.Control の C:\Documents and Settings\FF\Local Settings\Application Data\Temporary Projects\WindowsApplication1\Form1.vb:line 19 の Form1.Form1_Paint(Object sender, PaintEventArgs e)。
System.Windows.Forms.Control.WndProc(Message& m) で System.Windows.Forms.ScrollableControl.WndProc(Message& m) で System.Windows.Forms.Form.WndProc(Message& m) で System.Windows.Forms.Control .ControlNativeWindow.OnMessage(Message& m) System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) で System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) システムで。 Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& メッセージ)
System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop (IntPtr dwComponentID、Int32 理由、Int32 pvLoopData) で System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner (Int32 理由、ApplicationContext コンテキスト) で) Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun() で System.Windows.Forms.Application.ThreadContext.RunMessageLoop (Int32 理由、ApplicationContext コンテキスト) で Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel() で Microsoft.VisualBasic.ApplicationServices .WindowsFormsApplicationBase.Run(String[] commandLine) at WindowsApplication1.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81 System.AppDomain.System.AppDomain.ExecuteAssembly の _nExecuteAssembly (RuntimeAssembly アセンブリ、String[] args) (Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() の System.Threading.ThreadHelper.ThreadStart_Context(Object) の System.AppDomain.ExecuteAssembly(String assemblyFile、Evidence assemblySecurity、String[] args)状態) System.Threading.ExecutionContext.Run (ExecutionContext 実行コンテキスト、ContextCallback コールバック、オブジェクト状態、ブール値の ignoreSyncCtx) で System.Threading.ExecutionContext.Run (ExecutionContext 実行コンテキスト、ContextCallback コールバック、オブジェクト状態) で System.Threading.ThreadHelper.ThreadStart( )System.Threading.ThreadHelper.ThreadStart_Context(オブジェクトの状態) での RunUsersAssembly() System.Threading.ExecutionContext.Run(ExecutionContext の executionContext、ContextCallback コールバック、オブジェクトの状態、ブール値の ignoreSyncCtx) で、オブジェクトの状態) System.Threading.ThreadHelper.ThreadStart() でSystem.Threading.ThreadHelper.ThreadStart_Context(オブジェクトの状態) での RunUsersAssembly() System.Threading.ExecutionContext.Run(ExecutionContext の executionContext、ContextCallback コールバック、オブジェクトの状態、ブール値の ignoreSyncCtx) で、オブジェクトの状態) System.Threading.ThreadHelper.ThreadStart() で