【发布时间】:2020-10-25 08:30:37
【问题描述】:
我在单击按钮时调用 openFileDialog 时遇到问题。
相关代码:
Private Sub MemoCp_ButtonClick(sender As Object, e As ButtonPressedEventArgs) Handles MemoCp.ButtonClick
Dim Editor As ButtonEdit = CType(sender, ButtonEdit)
Dim Button As EditorButton = e.Button
If Editor.Properties.Buttons.IndexOf(e.Button).ToString() = 1 Then
Using ofd As New OpenFileDialog
ofd.InitialDirectory = "C:\"
ofd.FileName = ""
ofd.ShowHelp = True
ofd.ShowDialog() <-- Program crashes here
TryCast(sender, ButtonEdit).EditValue = ofd.FileName
End Using
End If
End Sub
我有一个带有 2 个复选框的表单。当我没有选中任何复选框并单击按钮时,它可以正常工作,但是如果我事先选中复选框并单击按钮,则会出现此错误:
Exception thrown at 0x769F1DF3 (shell32.dll) in Unos.exe: 0xC0000005: Access violation reading location 0x0000000A.
使用此调用堆栈:
shell32.dll!CExplorerBrowser::Advise() Unknown
comdlg32.dll!CFileOpenSave::_CreateExplorerBrowser() Unknown
comdlg32.dll!CFileOpenSave::_InitOpenSaveDialog(struct HWND__ *) Unknown
comdlg32.dll!CFileOpenSave::s_OpenSaveDlgProc(struct HWND__ *,unsigned int,unsigned int,long) Unknown
user32.dll!__InternalCallWinProc@20() Unknown
user32.dll!UserCallDlgProcCheckWow() Unknown
user32.dll!DefDlgProcWorker() Unknown
user32.dll!_DefDlgProcW@16() Unknown
user32.dll!__InternalCallWinProc@20() Unknown
user32.dll!UserCallWinProcCheckWow() Unknown
user32.dll!DispatchClientMessage() Unknown
user32.dll!___fnDWORD@4() Unknown
ntdll.dll!_KiUserCallbackDispatcher@12() Unknown
user32.dll!InternalCreateDialog() Unknown
user32.dll!InternalDialogBox() Unknown
user32.dll!_DialogBoxIndirectParamAorW@24() Unknown
user32.dll!_DialogBoxIndirectParamW@20() Unknown
comdlg32.dll!CFileOpenSave::Show(struct HWND__ *) Unknown
comdlg32.dll!_InvokeNewFileOpenSave(struct IFileDialog *,unsigned short,struct HWND__ *,struct _OFNINITINFO *,struct HWND__ *) Unknown
comdlg32.dll!_CreateNewFileOpenSaveInProc(unsigned short,struct HWND__ *,struct _OFNINITINFO *) Unknown
comdlg32.dll!NewGetFileName(struct OPENFILEINFO *,int) Unknown
comdlg32.dll!_GetFileName@8() Unknown
comdlg32.dll!_GetOpenFileNameW@4() Unknown
System.Windows.Forms.ni.dll!65f0b4f0() Unknown
[Frames below may be incorrect and/or missing, native debugger attempting to walk managed call stack] Unknown
[External Code]
> Unos.exe!Unos.FormUnos.MemoCp_ButtonClick(Object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e) Line 611 Basic
[External Code]
我正在努力解决这个问题 5 天,如果你能帮我解决这个问题,我将非常感激! 提前致谢。
编辑:
我尽可能地缩短了表单代码,这样问题仍然存在。以下是缩短版的完整代码:
Imports System.ComponentModel
Imports System.Data.OleDb
Imports System.Text
Imports DevExpress.XtraEditors.Controls
Partial Public Class Form1
Shared Sub New()
DevExpress.UserSkins.BonusSkins.Register()
End Sub
Public Sub New()
InitializeComponent()
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
Drzave_LookUp()
End Sub
Public Sub Drzave_LookUp()
Dim sqlDrzave As String = "Select Drzave.SifraDrzave, Drzave.Naziv, Drzave.OZNAKA " &
" FROM Drzave INNER JOIN Kupci On Drzave.SifraDrzave = Kupci.Drzava " &
" GROUP BY Drzave.SifraDrzave, Drzave.Naziv, Drzave.OZNAKA " &
" ORDER BY Drzave.SifraDrzave "
Dim DrzaveAdapter As OleDbDataAdapter = New OleDbDataAdapter(sqlDrzave, cn)
Dim dsKupci As DataSet = New DataSet
DrzaveAdapter.Fill(dsKupci, "Drzave")
SearchLookUpEdit1.Properties.DataSource = dsKupci.Tables("Drzave")
SearchLookUpEdit1.Properties.DisplayMember = "Naziv"
SearchLookUpEdit1.Properties.ValueMember = "Naziv"
SearchLookUpEdit1.Properties.BestFitMode = BestFitMode.BestFitResizePopup
SearchLookUpEdit1.Properties.PopulateViewColumns()
End Sub
Private Sub SearchLookUpEdit1_EditValueChanged(sender As Object, e As EventArgs) Handles SearchLookUpEdit1.EditValueChanged
Objekti_LookUp(SearchLookUpEdit1.EditValue)
End Sub
Public Sub Objekti_LookUp(ByVal drzava As String)
Dim sqlObjekti As String = "SELECT Objekti.SifraObjekta, Objekti.Naziv, Objekti.Adresa, Objekti.Mesto, Objekti.Instalater, Objekti.Drzava " &
" FROM Objekti " &
" WHERE (((Objekti.Drzava)='" & drzava & "')) "
Dim ObjektiAdapter As OleDbDataAdapter = New OleDbDataAdapter(sqlObjekti, cn)
Dim dsObjekti As DataSet = New DataSet
ObjektiAdapter.Fill(dsObjekti, "Objekti")
SearchLookUpEdit2.Properties.DataSource = dsObjekti.Tables("Objekti")
SearchLookUpEdit2.Properties.DisplayMember = "SifraObjekta"
SearchLookUpEdit2.Properties.ValueMember = "SifraObjekta"
SearchLookUpEdit2.Properties.BestFitMode = BestFitMode.BestFitResizePopup
SearchLookUpEdit2.Properties.PopulateViewColumns()
End Sub
Private Sub SimpleButton1_Click(sender As Object, e As EventArgs) Handles SimpleButton1.Click
Dim SelectedFilePath As String = ""
Using ofd As New OpenFileDialog
ofd.InitialDirectory = "Z:\"
ofd.FileName = ""
ofd.ShowHelp = True
If ofd.ShowDialog() = DialogResult.OK Then <-- Program crashes here
SelectedFilePath = ofd.FileName
End If
End Using
Debug.Print(SelectedFilePath)
End Sub
End Class
【问题讨论】:
-
默认情况下,用户对 C:\ 驱动器根目录下的文件没有权限。至少从 2002 年开始就是如此。此外,不能保证您甚至拥有 C:\ 驱动器。如果您知道自己在做什么,您可以将驱动器设置为 D: 或大多数其他字母并在那里安装 Windows。
-
但是如果我打开表单时做的第一件事是单击按钮,它会在 C:\ 处打开它而不会出错。如果我在单击按钮(调用 openFileDialog())之前单击复选框,则会发生错误。如果我不幸地从 C 更改为 D,错误仍然会发生。
-
check_changed 事件有代码吗?
-
嗨,我编辑了原始帖子,添加了整个(缩短的)代码。这样好吗?
-
去睡觉了,现在回来看看编辑,这是非常不好:
" WHERE (((Objekti.Drzava)='" & drzava & "')) "。这称为 SQL 注入,这是一个大问题。不要那样做!
标签: .net vb.net devexpress