savefiledialog "sometimes" 抛出 System.AccessViolationException
savefiledialog "sometimes" throws an System.AccessViolationException
我在 Visual Studio 2013
中使用 Win7
我的应用程序是一个带有 GeckoFx 的网络浏览器组件。在下载调用中,我触发打开 SaveFileDialog。在某些情况下(不是每次调用),当我在第 822 行调用 SaveFileDialog 时(另请参见下面的代码),我收到以下错误:
System.AccessViolationException wurde nicht behandelt.
HResult=-2147467261
Message=Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.
Source=System.Windows.Forms
StackTrace:
bei System.Windows.Forms.UnsafeNativeMethods.GetSaveFileName(OPENFILENAME_I ofn)
bei System.Windows.Forms.SaveFileDialog.RunFileDialog(OPENFILENAME_I ofn)
bei System.Windows.Forms.FileDialog.RunDialogOld(IntPtr hWndOwner)
bei System.Windows.Forms.FileDialog.RunDialog(IntPtr hWndOwner)
bei System.Windows.Forms.CommonDialog.ShowDialog(IWin32Window owner)
bei System.Windows.Forms.CommonDialog.ShowDialog()
bei MYAPPLICATION.modMain.LauncherDialog_Download(Object sender, LauncherDialogEvent e) in X:\COMPANY\products\APPLICATIONWITHGecko45\MYAPPLICATION\modMain.vb:Zeile 822.
bei Gecko.LauncherDialog.Show(nsIHelperAppLauncher aLauncher, nsISupports aWindowContext, UInt32 aReason) in D:\tempf0c5cd\Geckofx-Winforms\Dialogs\GeckoHelperAppLauncherDialog.cs:Zeile 91.
bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.Run(ApplicationContext context)
bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
bei MYAPPLICATION.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 81.
InnerException:
我已经搜索过这个问题并解决了 saveFileDialog1.AutoUpgradeEnabled = False 正如许多解决方案所建议的那样,但它没有帮助。
这是出现错误的行。
注意:在某些情况下我不得不调用 SaveFileDialog 两次。我不知道为什么会这样。我刚刚问了另一个问题为什么会这样(见这里)
Public Sub LauncherDialog_Download(ByVal sender As Object, ByVal e As Gecko.LauncherDialogEvent)
Try
Dim P As String = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & Path.DirectorySeparatorChar & "tmp" 'globalParameters._downloadDirectory '
If Not System.IO.Directory.Exists(P) Then System.IO.Directory.CreateDirectory(P)
Dim objTarget As nsILocalFile = Xpcom.CreateInstance(Of nsILocalFile)("@mozilla.org/file/local;1")
Using tmp As New nsAString(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + vbTab & "temp.tmp")
objTarget.InitWithPath(tmp)
End Using
'Save file dialog
Dim saveFileDialog1 As New SaveFileDialog()
saveFileDialog1.Filter = "CSV file (*.csv)|*.csv|All files (*.*)|*.*"
saveFileDialog1.FilterIndex = 2
saveFileDialog1.RestoreDirectory = True
saveFileDialog1.FileName = e.Filename
saveFileDialog1.AutoUpgradeEnabled = False
saveFileDialog1.CheckPathExists = False
saveFileDialog1.InitialDirectory = globalParameters.getDownloadDirectory() 'globalParameters._downloadDirectory
If globalParameters._doNotShowDownloadPrompt Then
' this code Part does not happen in my cases and we can ignore it
Else
Dim dialogResultValue As DialogResult
Try
dialogResultValue = saveFileDialog1.ShowDialog()
Catch ex As Exception
logging.logInformation("Problems during loading of dialog: " & ex.ToString())
End Try
' SpecialCase, if CSV File or Dicom just reopen dialog
' crazy but helps to display dialog
logging.logInformation("Download URL: " & e.Url)
If (e.Url.Contains("format=CSV") Or e.Url.Contains("DocGenericZIP") Or e.Url.Contains("type=application/dicom")) And dialogResultValue = DialogResult.Cancel Then
Try
saveFileDialog1.Dispose() ' dispose old saveFileDialog
saveFileDialog1 = New SaveFileDialog()
saveFileDialog1.Filter = "CSV file (*.csv)|*.csv|All files (*.*)|*.*"
saveFileDialog1.FilterIndex = 2
saveFileDialog1.RestoreDirectory = True
saveFileDialog1.FileName = e.Filename
saveFileDialog1.AutoUpgradeEnabled = False
saveFileDialog1.InitialDirectory = globalParameters.getDownloadDirectory()
saveFileDialog1.CheckPathExists = False
dialogResultValue = saveFileDialog1.ShowDialog() 'this is the line 822 mentioned in the error above
Catch ex As Exception
logging.logInformation("Errors during loading of fole Dialog: " & ex.ToString())
End Try
End If
' if upper saveFileDialog runs without errors, following lines works like a charm
If dialogResultValue = DialogResult.OK Then
Try
' these lines put the download Information into another thread, so that the download
' can run and the user can use the browser simultaneously,
' otherwise the interaction in main-Form is blocked
Dim par As New Parameters
par.sender = sender
par.e = e
par.mime = e.Mime
par.url = e.Url
par.fileName = saveFileDialog1.FileName
par.dialogResultValue = dialogResultValue
par.myStream = saveFileDialog1.OpenFile()
ThreadJob(par)
Catch ex As Exception
logging.logInformation("Error during loading of File" & e.ToString)
End Try
End If
End If
Catch ex As Exception
logging.logInformation("Error during loading file. " & ex.ToString, "main", True)
Finally
'nothing to do here
End Try
End Sub
我看了你的两个问题,虽然我没有使用 GeckoFx 的经验,但我会从本地创建文件的方式开始。你得到一个 AccessViolation -2147467261 这通常意味着损坏的内存(或至少锁定的内存)。
这可以解释您在其他问题中描述的行为。如果 globalParameters.getDownloadDirectory()
中指定的目录本身无效,或者它被导致您的根本问题的任何原因损坏,对话框可能会关闭(这只是推测,因为它没有解释为什么没有抛出错误)。
为了调试这个,我会在您每次创建目录 and/or 文件时记录。我还会在整个执行过程中定期检查您是否有权访问要保存到的目录和文件。我这样做的原因是因为 AccessViolation
发生在非托管函数 GetSaveFileName(OPENFILENAME_I ofn)
中。这是用于初始化对话框的函数,我相信设置了 InitialDirectory。您应该能够看到 InitialDirectory 和默认文件名。有了这些数据,当它出错时,您将有望看到一个模式。
很难说得更具体,因为您没有描述 globalParameters.getDownloadDirectory()
是如何填充的,或者它是否发生了变化。至此,一个线程提到 .RestoreDirectory
可能是问题的原因,因此可以尝试禁用它。你还说错误是在第 822 行抛出的,但没有包括行号,所以我不知道具体是哪一行出错了。
附带说明一下,我不确定您使用 objTarget As nsILocalFile
的目的是什么,而且您似乎没有在代码中进一步使用它。这可能是你的记忆被破坏的地方,或者这只是我对 GeckoFx 的无知。
如果 none 有效,您可能需要设法从 System.Windows.Forms.UnsafeNativeMethods.GetSaveFileName(OPENFILENAME_I ofn)
.
内部获取非托管代码 StackTrace
General AccessViolation TroubleShooting
祝你好运!
我在 Visual Studio 2013
中使用 Win7我的应用程序是一个带有 GeckoFx 的网络浏览器组件。在下载调用中,我触发打开 SaveFileDialog。在某些情况下(不是每次调用),当我在第 822 行调用 SaveFileDialog 时(另请参见下面的代码),我收到以下错误:
System.AccessViolationException wurde nicht behandelt.
HResult=-2147467261
Message=Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.
Source=System.Windows.Forms
StackTrace:
bei System.Windows.Forms.UnsafeNativeMethods.GetSaveFileName(OPENFILENAME_I ofn)
bei System.Windows.Forms.SaveFileDialog.RunFileDialog(OPENFILENAME_I ofn)
bei System.Windows.Forms.FileDialog.RunDialogOld(IntPtr hWndOwner)
bei System.Windows.Forms.FileDialog.RunDialog(IntPtr hWndOwner)
bei System.Windows.Forms.CommonDialog.ShowDialog(IWin32Window owner)
bei System.Windows.Forms.CommonDialog.ShowDialog()
bei MYAPPLICATION.modMain.LauncherDialog_Download(Object sender, LauncherDialogEvent e) in X:\COMPANY\products\APPLICATIONWITHGecko45\MYAPPLICATION\modMain.vb:Zeile 822.
bei Gecko.LauncherDialog.Show(nsIHelperAppLauncher aLauncher, nsISupports aWindowContext, UInt32 aReason) in D:\tempf0c5cd\Geckofx-Winforms\Dialogs\GeckoHelperAppLauncherDialog.cs:Zeile 91.
bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.Run(ApplicationContext context)
bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
bei MYAPPLICATION.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 81.
InnerException:
我已经搜索过这个问题并解决了 saveFileDialog1.AutoUpgradeEnabled = False 正如许多解决方案所建议的那样,但它没有帮助。
这是出现错误的行。
注意:在某些情况下我不得不调用 SaveFileDialog 两次。我不知道为什么会这样。我刚刚问了另一个问题为什么会这样(见这里
Public Sub LauncherDialog_Download(ByVal sender As Object, ByVal e As Gecko.LauncherDialogEvent)
Try
Dim P As String = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & Path.DirectorySeparatorChar & "tmp" 'globalParameters._downloadDirectory '
If Not System.IO.Directory.Exists(P) Then System.IO.Directory.CreateDirectory(P)
Dim objTarget As nsILocalFile = Xpcom.CreateInstance(Of nsILocalFile)("@mozilla.org/file/local;1")
Using tmp As New nsAString(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + vbTab & "temp.tmp")
objTarget.InitWithPath(tmp)
End Using
'Save file dialog
Dim saveFileDialog1 As New SaveFileDialog()
saveFileDialog1.Filter = "CSV file (*.csv)|*.csv|All files (*.*)|*.*"
saveFileDialog1.FilterIndex = 2
saveFileDialog1.RestoreDirectory = True
saveFileDialog1.FileName = e.Filename
saveFileDialog1.AutoUpgradeEnabled = False
saveFileDialog1.CheckPathExists = False
saveFileDialog1.InitialDirectory = globalParameters.getDownloadDirectory() 'globalParameters._downloadDirectory
If globalParameters._doNotShowDownloadPrompt Then
' this code Part does not happen in my cases and we can ignore it
Else
Dim dialogResultValue As DialogResult
Try
dialogResultValue = saveFileDialog1.ShowDialog()
Catch ex As Exception
logging.logInformation("Problems during loading of dialog: " & ex.ToString())
End Try
' SpecialCase, if CSV File or Dicom just reopen dialog
' crazy but helps to display dialog
logging.logInformation("Download URL: " & e.Url)
If (e.Url.Contains("format=CSV") Or e.Url.Contains("DocGenericZIP") Or e.Url.Contains("type=application/dicom")) And dialogResultValue = DialogResult.Cancel Then
Try
saveFileDialog1.Dispose() ' dispose old saveFileDialog
saveFileDialog1 = New SaveFileDialog()
saveFileDialog1.Filter = "CSV file (*.csv)|*.csv|All files (*.*)|*.*"
saveFileDialog1.FilterIndex = 2
saveFileDialog1.RestoreDirectory = True
saveFileDialog1.FileName = e.Filename
saveFileDialog1.AutoUpgradeEnabled = False
saveFileDialog1.InitialDirectory = globalParameters.getDownloadDirectory()
saveFileDialog1.CheckPathExists = False
dialogResultValue = saveFileDialog1.ShowDialog() 'this is the line 822 mentioned in the error above
Catch ex As Exception
logging.logInformation("Errors during loading of fole Dialog: " & ex.ToString())
End Try
End If
' if upper saveFileDialog runs without errors, following lines works like a charm
If dialogResultValue = DialogResult.OK Then
Try
' these lines put the download Information into another thread, so that the download
' can run and the user can use the browser simultaneously,
' otherwise the interaction in main-Form is blocked
Dim par As New Parameters
par.sender = sender
par.e = e
par.mime = e.Mime
par.url = e.Url
par.fileName = saveFileDialog1.FileName
par.dialogResultValue = dialogResultValue
par.myStream = saveFileDialog1.OpenFile()
ThreadJob(par)
Catch ex As Exception
logging.logInformation("Error during loading of File" & e.ToString)
End Try
End If
End If
Catch ex As Exception
logging.logInformation("Error during loading file. " & ex.ToString, "main", True)
Finally
'nothing to do here
End Try
End Sub
我看了你的两个问题,虽然我没有使用 GeckoFx 的经验,但我会从本地创建文件的方式开始。你得到一个 AccessViolation -2147467261 这通常意味着损坏的内存(或至少锁定的内存)。
这可以解释您在其他问题中描述的行为。如果 globalParameters.getDownloadDirectory()
中指定的目录本身无效,或者它被导致您的根本问题的任何原因损坏,对话框可能会关闭(这只是推测,因为它没有解释为什么没有抛出错误)。
为了调试这个,我会在您每次创建目录 and/or 文件时记录。我还会在整个执行过程中定期检查您是否有权访问要保存到的目录和文件。我这样做的原因是因为 AccessViolation
发生在非托管函数 GetSaveFileName(OPENFILENAME_I ofn)
中。这是用于初始化对话框的函数,我相信设置了 InitialDirectory。您应该能够看到 InitialDirectory 和默认文件名。有了这些数据,当它出错时,您将有望看到一个模式。
很难说得更具体,因为您没有描述 globalParameters.getDownloadDirectory()
是如何填充的,或者它是否发生了变化。至此,一个线程提到 .RestoreDirectory
可能是问题的原因,因此可以尝试禁用它。你还说错误是在第 822 行抛出的,但没有包括行号,所以我不知道具体是哪一行出错了。
附带说明一下,我不确定您使用 objTarget As nsILocalFile
的目的是什么,而且您似乎没有在代码中进一步使用它。这可能是你的记忆被破坏的地方,或者这只是我对 GeckoFx 的无知。
如果 none 有效,您可能需要设法从 System.Windows.Forms.UnsafeNativeMethods.GetSaveFileName(OPENFILENAME_I ofn)
.
General AccessViolation TroubleShooting
祝你好运!