Ookii-dialogs-wpf: λ””λ²„κ±°μ—μ„œ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ” ν•œ 쀑단

에 λ§Œλ“  2019λ…„ 11μ›” 25일  Β·  3μ½”λ©˜νŠΈ  Β·  좜처: ookii-dialogs/ookii-dialogs-wpf

WPF .NET 4.6.1 μ‘μš© ν”„λ‘œκ·Έλž¨μ—μ„œ VistaFolderBrowserDialogλ₯Ό μ‚¬μš©ν•˜λ €κ³  ν•˜λ©΄ μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μ€‘λ‹¨λ©λ‹ˆλ‹€. 디버그 λ˜λŠ” 릴리슀 λͺ¨λ“œμ—μ„œ λ””λ²„κ±°μ—μ„œ μ‹€ν–‰ν•˜λ©΄ ν›Œλ₯­ν•˜κ²Œ μž‘λ™ν•©λ‹ˆλ‹€.

λ‹€μ–‘ν•œ ν˜ΈμΆœμ„ λ³€κ²½ν•˜κ³  Nuget νŒ¨ν‚€μ§€λ‘œ μ „ν™˜ν•˜μ—¬ μƒ˜ν”Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 이λ₯Ό μž¬ν˜„ν•˜λ €κ³  μ‹œλ„ν–ˆμ§€λ§Œ μ—¬μ „νžˆ μ œλŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€.

VistaFolderBrowserDialogλ₯Ό ν˜ΈμΆœν•˜κ³  μƒ˜ν”Œ μ½”λ“œλ₯Ό λ‚΄ μ‘μš© ν”„λ‘œκ·Έλž¨μ— 볡사/λΆ™μ—¬λ„£κΈ°ν•˜λŠ” 방법을 λ‹¨μˆœν™”ν•˜λ €κ³  ν–ˆμ§€λ§Œ μ—¬μ „νžˆ μ€‘λ‹¨λ©λ‹ˆλ‹€.

문제λ₯Ό μΆ”μ ν•˜λŠ” 이유 λ˜λŠ” 방법에 λŒ€ν•œ 생각이 μžˆμŠ΅λ‹ˆκΉŒ?

need-more-info

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

@augustoproiete, 빨리 λŒμ•„μ™€ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. λ‚˜λŠ” 사물을 νƒμƒ‰ν•˜κΈ° μœ„ν•΄ λ‹€μ–‘ν•œ μž¬ν˜„ 단계λ₯Ό μ‹œλ„ν–ˆμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ WPF μ‘μš© ν”„λ‘œκ·Έλž¨μ— 더 λ§Žμ€ μ‚¬μš©λ²•μ„ μΆ”κ°€ν•˜μ—¬ μž‘λ™ν•˜μ§€ μ•ŠλŠ” 이유λ₯Ό 식별할 수 μžˆλŠ” λͺ‡ 가지 곡톡 μš”μ†Œκ°€ μžˆλŠ”μ§€ ν™•μΈν•˜λ €κ³  ν•©λ‹ˆλ‹€.

λ‘œκ·ΈμΈμ„ ν•˜κ³  λ‚΄ μ‘μš© ν”„λ‘œκ·Έλž¨μ—μ„œ μž¬ν˜„ν–ˆλŠ”λ° int result = dialog.Show(owner); in private bool RunDialog(IntPtr owner) μ€‘λ‹¨λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  3 λŒ“κΈ€

@matelich λ‹˜ 이 μ„€λͺ…ν•œ κ΅μˆ˜ν˜• λ™μž‘μ„ μž¬ν˜„ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

첨뢀 파일 은 Ookii.Dialogs.Wpf v1.1.0 (_이 글을 μ“°λŠ” μ‹œμ μ—μ„œ_)을 μ‚¬μš©ν•˜μ—¬ VistaFolderBrowserDialog λ₯Ό μ—¬λŠ” .NET 4.6.1을 μ‚¬μš©ν•˜λŠ” WPF μ•±μ˜ μƒ˜ν”Œ ν”„λ‘œμ νŠΈμ΄λ©° λ‹€μŒμ„ μ‹€ν–‰ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

  • Debug λΉŒλ“œ _without_ 디버거 μ—°κ²°
  • Debug λΉŒλ“œ _with_ 디버거 μ—°κ²°
  • Release 디버거가 _ν¬ν•¨λ˜μ§€ μ•Šμ€_ λΉŒλ“œ
  • Release λΉŒλ“œ _with_ 디버거 μ—°κ²°

정지 λ˜λŠ” μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

κ΅μˆ˜ν˜• λ™μž‘μ„ μž¬ν˜„ν•  수 μžˆλŠ” 방법을 μ•Œλ €μ£Όμ‹œλ©΄ 더 μžμ„Ένžˆ μ‘°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€.

μ²¨λΆ€λœ μƒ˜ν”Œμ˜ κ΄€λ ¨ μ½”λ“œ:

var dialog = new VistaFolderBrowserDialog
{
    Description = "Please select a folder.",
    UseDescriptionForTitle = true,
};

if (!VistaFolderBrowserDialog.IsVistaFolderDialogSupported)
{
    MessageBox.Show(this,
        "You are using an old Windows version. The regular folder browser dialog will open.",
        "Sample folder browser dialog");
}

if (dialog.ShowDialog(this).GetValueOrDefault(false))
{
    MessageBox.Show(this, "The selected folder was: " + dialog.SelectedPath,
        "Sample folder browser dialog");
}

image

image


@augustoproiete, 빨리 λŒμ•„μ™€ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. λ‚˜λŠ” 사물을 νƒμƒ‰ν•˜κΈ° μœ„ν•΄ λ‹€μ–‘ν•œ μž¬ν˜„ 단계λ₯Ό μ‹œλ„ν–ˆμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ WPF μ‘μš© ν”„λ‘œκ·Έλž¨μ— 더 λ§Žμ€ μ‚¬μš©λ²•μ„ μΆ”κ°€ν•˜μ—¬ μž‘λ™ν•˜μ§€ μ•ŠλŠ” 이유λ₯Ό 식별할 수 μžˆλŠ” λͺ‡ 가지 곡톡 μš”μ†Œκ°€ μžˆλŠ”μ§€ ν™•μΈν•˜λ €κ³  ν•©λ‹ˆλ‹€.

λ‘œκ·ΈμΈμ„ ν•˜κ³  λ‚΄ μ‘μš© ν”„λ‘œκ·Έλž¨μ—μ„œ μž¬ν˜„ν–ˆλŠ”λ° int result = dialog.Show(owner); in private bool RunDialog(IntPtr owner) μ€‘λ‹¨λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

κ΄€λ ¨μ΄μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€ :
μ„ νƒν•œ κ²½λ‘œκ°€ κΈ΄ λ„€νŠΈμ›Œν¬ 경둜일 λ•Œ 속도가 느렀 μ§‘λ‹ˆλ‹€.

Native code debugging ν™œμ„±ν™”ν•˜λ©΄ λŒ€λΆ€λΆ„μ˜ μ‹œκ°„μ΄ 이 호좜 μŠ€νƒμ˜ μ–΄λ”˜κ°€μ—μ„œ μ†ŒλΉ„λœλ‹€λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

win32u.dll!NtUserMsgWaitForMultipleObjectsEx

() μ•Œλ €μ§€μ§€ μ•Šμ€
user32.dll!RealMsgWaitForMultipleObjectsEx() μ•Œ 수 μ—†μŒ
shell32.dll!SHProcessMessagesUntilEventsEx() μ•Œ 수 μ—†μŒ
shell32.dll!CChangeRouterProxy::RegisterThread() μ•Œ 수 μ—†μŒ
shell32.dll!SHChangeNotifyRegisterThread
() μ•Œλ €μ§€μ§€ μ•Šμ€
comdlg32.dll!CFileOpenSave::Show() μ•Œ 수 μ—†μŒ
[λ„€μ΄ν‹°λΈŒ μ „ν™˜μœΌλ‘œ 관리]
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.RunDialog(System.IntPtr μ†Œμœ μž) 171ν–‰ C#
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.ShowDialog(System.Windows.Window μ†Œμœ μž) 157ν–‰ C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow.ShowFolderBrowserDialog() 166ν–‰ C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow._showDialogButton_Click(객체 λ°œμ‹ μž, System.Windows.RoutedEventArgs e) 56ν–‰ C#

λ˜λŠ”:

win32u.dll!00007ff9d17c9164()   Unknown
user32.dll!00007ff9d2ca059d()   Unknown
shell32.dll!SHProcessMessagesUntilEventsEx()    Unknown
shell32.dll!CChangeRouterProxy::RegisterThread()    Unknown
shell32.dll!SHChangeNotifyRegisterThread()  Unknown
comdlg32.dll!CFileOpenSave::Show()  Unknown
[Managed to Native Transition]  
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.RunDialog(System.IntPtr owner) Line 171    C#
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.ShowDialog(System.Windows.Window owner) Line 157   C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow.ShowFolderBrowserDialog() Line 166 C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow._showDialogButton_Click(object sender, System.Windows.RoutedEventArgs e) Line 56   C#

λ˜λŠ”:

ntdll.dll!RtlpHashStringToAtom()    Unknown
ntdll.dll!RtlpFreeAllAtom

() μ•Œλ €μ§€μ§€ μ•Šμ€
ntdll.dll!RtlpDereferenceAtom() μ•Œ 수 μ—†μŒ
ntdll.dll!RtlDeleteAtomFromAtomTable() μ•Œ 수 μ—†μŒ
kernel32.dll!InternalDeleteAtom
() μ•Œλ €μ§€μ§€ μ•Šμ€
dui70.dll!DirectUI::κ°’::_ZeroRelease() μ•Œ 수 μ—†μŒ
dui70.dll!DirectUI::DUIXmlParser::_DestroyTables(void) μ•Œ 수 μ—†μŒ
dui70.dll!DirectUI::DUIXmlParser::~DUIXmlParser() μ•Œ 수 μ—†μŒ
dui70.dll!DirectUI::DUIXmlParser::`벑터 μ‚­μ œ μ†Œλ©Έμž'() μ•Œ 수 μ—†μŒ
dui70.dll!DirectUI::AccHDelete(클래슀 DirectUI::RefcountBase *) μ•Œ 수 μ—†μŒ
shell32.dll!_DUI_ShellStyleSheet_UninitThreadIfPossible(void) μ•Œ 수 μ—†μŒ
shell32.dll!DUI_ShellStyleSheet_UninitThread(void) μ•Œ 수 μ—†μŒ
shell32.dll!CDUIViewFrame::DestroyFrameWindow(void) μ•Œ 수 μ—†μŒ
shell32.dll!CExplorerBrowser::_CleanupFrame(void) μ•Œ 수 μ—†μŒ
shell32.dll!CExplorerBrowser::Destroy() μ•Œ 수 μ—†μŒ
comdlg32.dll!CFileOpenSave::_OnDestroyDialog() μ•Œ 수 μ—†μŒ
comdlg32.dll!CFileOpenSave::s_OpenSaveDlgProc() μ•Œ 수 μ—†μŒ
user32.dll!UserCallDlgProcCheckWow() μ•Œ 수 μ—†μŒ
user32.dll!DefDlgProcWorker() μ•Œ 수 μ—†μŒ
user32.dll!DefDlgProcW
() μ•Œλ €μ§€μ§€ μ•Šμ€
user32.dll!UserCallWinProcCheckWow() μ•Œ 수 μ—†μŒ
user32.dll!DispatchClientMessage() μ•Œ 수 μ—†μŒ
user32.dll!__fnDWORD
() μ•Œλ €μ§€μ§€ μ•Šμ€
ntdll.dll!KiUserCallbackDispatcher계속
() μ•Œλ €μ§€μ§€ μ•Šμ€
win32u.dll!NtUserDestroyWindow
() μ•Œλ €μ§€μ§€ μ•Šμ€
user32.dll!DialogBox2() μ•Œ 수 μ—†μŒ
user32.dll!InternalDialogBox() μ•Œ 수 μ—†μŒ
user32.dll!DialogBoxIndirectParamAorW
() μ•Œλ €μ§€μ§€ μ•Šμ€
user32.dll!DialogBoxIndirectParamW
() μ•Œλ €μ§€μ§€ μ•Šμ€
comdlg32.dll!CFileOpenSave::Show() μ•Œ 수 μ—†μŒ
[λ„€μ΄ν‹°λΈŒ μ „ν™˜μœΌλ‘œ 관리]
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.RunDialog(System.IntPtr μ†Œμœ μž) 171ν–‰ C#
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.ShowDialog(System.Windows.Window μ†Œμœ μž) 157ν–‰ C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow.ShowFolderBrowserDialog() 166ν–‰ C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow._showDialogButton_Click(객체 λ°œμ‹ μž, System.Windows.RoutedEventArgs e) 56ν–‰ C#

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰