2016-12-20 6 views
1

Мне нужно сохранить старое устаревшее приложение Windows Forms. Я просто получил исходный код, документацию или что-то еще. Я создаю приложение с помощью Visual Studio 2015, работающего на 64-разрядной версии Windows 8.1 и использующей .NET Framework 4.5. Все работает отлично, за исключением одного, для отображения содержимого папки используется элемент управления VbPowerPack (версия 1.0.1644.16184, tottaly) с именем FileViewer, и он просто перестает бросать исключение в первый раз, когда панель установлена ​​на видWindows Forms - VbPowerPack v1 FileViewer, бросающий неожиданное исключение

System.OverflowException: Arithmetic operation resulted in an overflow. 
    at System.IntPtr.ToInt32() 
    at VbPowerPack.ShellFolder.GetTypeDescriptionForFile(String in_path) in C:\Documents and Settings\Ken\My Documents\Visual Studio Projects\VbPowerPack Source\VbPowerPack\ShellFolder.vb:line 264 
    at VbPowerPack.FileViewer.populateControl() in C:\Documents and Settings\Ken\My Documents\Visual Studio Projects\VbPowerPack Source\VbPowerPack\FileViewer.vb:line 992 
    at VbPowerPack.FileViewer.CreateHandle() in C:\Documents and Settings\Ken\My Documents\Visual Studio Projects\VbPowerPack Source\VbPowerPack\FileViewer.vb:line 866 
    at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible) 
    at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible) 
    at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible) 
    at System.Windows.Forms.Control.CreateControl() 
    at System.Windows.Forms.Control.SetVisibleCore(Boolean value) 
    at System.Windows.Forms.TabPage.set_Visible(Boolean value) 
    at System.Windows.Forms.TabControl.UpdateTabSelection(Boolean updateFocus) 
    at System.Windows.Forms.TabControl.OnSelectedIndexChanged(EventArgs e) 
    at System.Windows.Forms.TabControl.WmSelChange() 
    at System.Windows.Forms.TabControl.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 

(Обратите внимание, что я не Кен, упомянутый в исключении, DLL, должно быть, была скомпилирована на его компьютере, и я получаю то же исключение, только без части Кена, если я использую другой экземпляр того же DLL найти в интернете)

Exception screenshot

после этого, если щелчок «Cont inue "в« Необработанном окне исключений », и я нажимаю на другую вкладку, а затем снова пытаюсь выполнить это, показывая элемент управления, если исключение не будет сброшено снова, но ни один из содержимого папки не существует.

Я попытался добавить тот же элемент управления новой формы во вновь созданный пустой проект Windows Forms внутри этого решения, и он ведет себя одинаково. Но когда я создаю новое пустое решение с новым проектом Windows Forms и использую только элемент управления FileViewer, он отлично работает. Также это работает в проблемном решении, когда я открываю форму в представлении дизайна (не запуская приложение), это показывает мне содержимое папки. Я пробовал отлаживать, но исключение генерируется до того, как оно вызывает какие-либо события типа «VisibleChanged». Я также пробовал комментировать любой другой код, который может повлиять на это, но не повезло. Вот как инициализируется управление

public partial class DocumentsForm 
{ 
    private VbPowerPack.FileViewer fileViewer; 
    ... 

    private void InitializeComponent() 
    { 
     this.fileViewer = new VbPowerPack.FileViewer(); 
     ... 
     this.fileViewer.AllowDrop = true; 
     this.fileViewer.ContextMenu = this.contextMenuFiles; 
     this.fileViewer.Dock = System.Windows.Forms.DockStyle.Fill; 
     this.fileViewer.HideSelection = false; 
     this.fileViewer.Location = new System.Drawing.Point(0, 34); 
     this.fileViewer.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3); 
     this.fileViewer.Name = "fileViewer"; 
     this.fileViewer.Path = "c:\\"; 
     this.fileViewer.Size = new System.Drawing.Size(842, 482); 
     this.fileViewer.Sorting = System.Windows.Forms.SortOrder.Ascending; 
     this.fileViewer.TabIndex = 0; 
     this.fileViewer.UseCompatibleStateImageBehavior = false; 
     this.fileViewer.ItemClicked += new VbPowerPack.FileViewer.ItemClickedEventHandler(this.fileViewer_ItemClicked); 
     this.fileViewer.ItemDoubleClicked += new VbPowerPack.FileViewer.ItemDoubleClickedEventHandler(this.fileViewer_ItemDoubleClicked); 
     this.fileViewer.LocationChanged += new System.EventHandler(this.fileViewer_LocationChanged); 
     this.fileViewer.VisibleChanged += new System.EventHandler(this.fileViewer_VisibleChanged); 
     this.fileViewer.DragDrop += new System.Windows.Forms.DragEventHandler(this.fileViewer_DragDrop); 
     this.fileViewer.DragEnter += new System.Windows.Forms.DragEventHandler(this.fileViewer_DragEnter); 
     ... 
     this.Controls.Add(this.fileViewer); 
     ... 
    } 
} 

Борьба в течение нескольких дней. Любая помощь и предложения приветствуются.

+1

Что вы делаете в некоторых из этих событий? В частности, LocationChanged и VisibleChanged. – LarsTech

+0

В этих событиях не было кода, я добавил туда фиктивный код, чтобы попытаться остановить отладчик там. События, у которых есть код, - это ItemClicked, ItemDoubleClicked, DragDrop и DragEnter, и ни один из них не запускается, когда отображается элемент управления, правильно? –

+0

вы можете прокомментировать весь код во всех случаях, чтобы быть уверенным, – GuidoG

ответ

0

Найденный! Проблема заключалась в том, что элементы управления VbPowerPack v1 необходимо использовать в 32-битном приложении, да, они такие старые. Мой компьютер - 64-битный, а Visual Studio по умолчанию задает целевой платформе для «Любой процессор», что означает 64-битное в моем случае. Объяснение того, как оно работает в недавно добавленных проектах, заключается в том, что эти проекты Win Forms были построены с целевой платформой, настроенной на «Любой процессор», но по умолчанию отмечен (отмечен) «Предпочитаю 32-разрядный».

Почему я не пытался запустить его как x86 раньше? Ну ... Запустив его в 32-битном, вытащили с ним другие проблемы, но после их разрешения работает FileViewer. Спасибо @LarsTech и @GuidoG за помощь.