ComDLG32.OCX как корректная замена ComDLG32.DLL (17.08.2013). Печать
2013 - Август
17.08.2013 08:53
Save & Share

Идея замены компонента ActiveX ComDLG32.ocx (входящего в состав Visual Basic v.6.0) на библиотеку ComDLG32.DLL (входящую в состав любой ОС Windows) появилась как желание избавиться от лишнего вторично распространяемого кода в собственных программах. Так было сделано ранее с компонентом ActiveX ComCTL32.ocx: просто добавлена строка "Private Declare Function InitCommonControls Lib "Comctl32.dll" () As Long". А вот с ComDLG32.ocx получился жестокий облом.

Что же требовалось такого ужасного от библиотеки ComDLG32.DLL, что я отказался от нее в итоге? А ничего необычного: замена событиям CommonDialog.ShowOpen и CommonDialog.ShowPrinter, хранение информации об открытом файле при помощи события ShowOpen.

За событие CommonDialog.ShowOpen в библиотеке ComDLG32.DLL отвечает функция GetOpenFileName с указателем на структуру OPENFILENAME, параметры которой достаточно прописать вручную. Но на практике сложилось так, что сама функция GetOpenFileName ведет себя хаотично. У меня она не заработала. В интернете пишут следующие глюки:
- функция работает в Windows XP Home, но не работает в Windows XP Pro;
- функция работает в Windows 7, но не работает в Windows XP (мой случай оказался);
- различное рабочее поведение функции в разных средах (к примеру, автозамена открываемого пути по умолчанию (lpstrInitialDir, составляющей структуры OPENFILENAME) в Windows Vista и выше;
- один и тот же код с использованием данной функции работает в среде программирования Delphi, но не работает в среде программирования Visual Basic v.6.0;
- библиотека изначально не подгружена системой, а LoadLibrary не дает результата.

В итоге в интернете порождается множество кривых и глючных "оптимизированных" алгоритмов работы с данной функцией и функций-замен ее. Подумал и решил, что лучше оставить свои ComDLG32.ocx без изменений: уж больно много косяков у его "собрата".

Обновлено ( 22.11.2013 19:05 )