Windows Forms - VbPowerPack v1 FileViewer вызывает непредвиденное исключение
Мне нужно поддерживать старое устаревшее приложение Windows Forms. Я только что получил исходный код, никакой документации или чего-то еще. Я создаю приложение с помощью Visual Studio 2015, работающей на 64-битной Windows 8.1 и использующей.NET Framework 4.5. Все работает отлично, за исключением одной вещи, элемента управления VbPowerPack (версия 1.0.1644.16184, полностью устаревший) с именем 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, найденный в Интернете.)
после этого, если нажать "Продолжить" в "Окне необработанных исключений", и я щелкаю на другой вкладке, а затем снова пробую эту, она показывает элемент управления без исключения, который снова генерируется, но там нет содержимого папки.
Я попытался добавить этот же элемент управления в новую форму во вновь созданном пустом проекте 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 ответ
Нашел это! Проблема была в том, что элементы управления VbPowerPack v1 нужно было использовать в 32-битном приложении, да, они такие старые. Мой компьютер 64-битный, и Visual Studio по умолчанию устанавливает целевую платформу "Любой ЦП", что в моем случае означает 64-битный. Объяснение того, как это работает во вновь добавленных проектах, состоит в том, что эти проекты Win Forms были построены с целевым назначением платформы "Любой ЦП", но по умолчанию отмечен флажок "Предпочитать 32-разрядный".
Почему я не пытался запустить его как x86 раньше? Ну что ж... Запуск его в 32-битном режиме вызвал некоторые другие проблемы, но после их устранения работает элемент управления FileViewer. Спасибо @LarsTech и @GuidoG за попытку помочь.