В процессе разработки программного обеспечения возникают некоторые, казалось бы, простые проблемы, но обычные разработчики их легко игнорируют. Существование этих «ошибок» влияет на коммерциализацию нашего программного обеспечения. Ниже перечислено несколько таких проблем, с которыми столкнулся автор при использовании Visual Basic для разработки программного обеспечения. Здесь представлены решения для обсуждения и обмена.
1. Запретить приложению загружаться дважды
Когда наше приложение работает под Windows, во время работы мы иногда сворачиваем и скрываем его или переключаемся на диспетчер программ для других операций, а затем хотим войти в исходное приложение. Если мы забудем, если вы перезапустите только что запущенное приложение, две копии одного и того же приложения будут загружены в память одновременно. Это не только занимает место в памяти, но также легко приводит к неправильной работе и потере данных. Чтобы этого не произошло, программа должна иметь возможность выдавать подсказку «уже загружено» или напрямую входить в приложение, которое загружается впервые. Эту проблему кажется трудноразрешимой. На самом деле, если мы понимаем механизм работы приложений управления Windows, ее можно легко решить.
Мы знаем, что для каждого запущенного приложения Windows назначает уникальный «Дескриптор» и код модуля (Module). Когда две копии одной и той же программы запускаются одновременно, коды модулей обеих программ одинаковы. Поэтому, пока мы находим в памяти два идентичных кода модуля, мы знаем, что работают две копии программы. и может контролировать это. Эту задачу можно выполнить с помощью двух интерфейсных функций GetModuleHandle и GetModuleUsage, предоставляемых Windows. Конкретный метод заключается в следующем: сначала объявите функцию API в новом файле модуля (*.Bas).
DeclareFunctionGetModuleHandleLibKernel(ByVallpPROgName$)
DeclareFunctionGetModuleUsageLibKernel(ByValhModule)
В то же время создайте подпроцесс с именем main. Код в подпроцессе следующий:
Подглавный()
Обработка ошибок OnErrorGoToerrMain
Дескриптор модуля DimhModule
DimAppCount'Количество приложений
appPath$=app.Path /'путь запуска приложения
hModule=GetModuleHandle(appPath$ app.EXEName .exe)'Получите дескриптор программы.
AppCount=GetModuleUsage(hModule)'Получает код модуля, то есть количество запущенных приложений.
lfAppCount>1Then'Номер одного и того же приложения больше 1
Программа MsgBox загружена, 64
End» завершает запущенное в данный момент приложение.
Эльск
mainForm.Show'mainForm — основная форма программы.
Конец
ВыходSub
errMain:
lfErr<>0Тогда
Произошла ошибка при запуске программы MsgBox, 64
ВыходSub
Конец
EndSub
После завершения процесса в главном меню VB3.0 [опции] выберите пункт меню [Проект] и установите для пункта [StartupFrom] значение Submain, то есть при запуске программы она сначала запускается из подпрограммы Submain. . Это гарантирует, что приведенный выше код будет выполнен. Submain — это имя подпроцесса, согласованное в VB3.0, и его нельзя заменить другими именами.
Восстановите EXE-файл, запустите приложение в диспетчере программ, затем сверните сгенерированную форму и запустите ее из диспетчера программ. Пользователь увидит окно сообщения, сообщающее пользователю, что приложение было запущено. После загрузки вторая программа завершает работу. исполнение. Вышеупомянутая программа используется только для предотвращения загрузки второй программы, но она не входит в первую программу автоматически, когда вторая программа не может быть запущена. Для достижения этой цели необходимо использовать относительно сложные процедуры, которые не будут здесь подробно описываться.
2. Определите путь установки Windows
В разрабатываемом нами программном обеспечении мы иногда напрямую вызываем небольшие приложения, предоставляемые Windows, такие как калькуляторы, планировщики и т. д., или нам нужно поместить некоторые специальные файлы в путь Windows или SYSTEM; Обычно Windows устанавливается в каталог C:WINDOWS, но пользователи могут по своему желанию изменить имя домашнего каталога Windows. Поэтому в нашем программном обеспечении нам необходимо определить путь установки Windows. Для решения этой проблемы Windows предоставляет две функции API: GetWindowsDirectory и GetSystemDirectory, которые могут возвращать имена каталога Windows и каталога SYSTEM.
Для этого подготовьте общую функцию GetWinDir, которая возвращает имя каталога установки Windows. Аналогичным образом вы можете написать GetSysDir, опустив.
Объявление функций API в файлах модуля *.BAS
DeclareFunctionGetWindowsDirectoryLibKernel(ByValipBufferAsString,ByValnSizeAsInteger)asIntegerFunctionGetWinDir()AsStringDimWindir$Windir$=Space$(144)'144 — это теоретическая максимальная длина имени каталога WINDOWS.
lfGetWindowsDirectory(Windir$,144)=0Тогда
MsgBox не может определить путь установки WINDOWS, 16
GetWinDir=
Еще
Windir$=ALLTrim$(Windir$)
ifRight$(Windir$,1)<>“/”thenWindir$=Windir$ “/”
'Добавить обратную косую черту
GetWinDir=Виндир$
Конец
Конечнаяфункция
Среди них ALLTRIM — функция, используемая для удаления нулевых символов в строке.
FunctionALLTrim(FatStr$)AsString
'thisFunctiondeleteSpacecharinstringofFatStr$
DimSlimStr$,I
SlimStr$=FatStr$
I=lnStr(SlimStr$,Chr$(0))'Положение пространства
IfIThenSlimStr$=Left$(SlimStr$,I-1)
SlimStr$=Ltrim$(Rtrim$)(SlimStr$))
AIITrim$=SlimStr$
Конечнаяфункция
3. Предложение сохранить данные перед закрытием формы.
Вообще говоря, обычно существует 5 способов закрыть приложение:
1. Пользователь выбирает команду [Закрыть] в ControlBox текущей формы.
2. Стимулируйте код команды завершения в программе (например, «Конец», «Выгрузка»).
3. Выйдите из Windows
4. Закройте приложение в списке задач Windows.
5. Во время работы с несколькими документами закрытие основной формы MDI приведет к закрытию вспомогательной формы MDI.
Прежде чем закрыть приложение, нам нужно дать пользователю возможность спросить «Хотите сохранить данные?» или отменить операцию «закрытия». В VB закрытие формы вызывает событие Form_Unload. Мы можем запрограммировать это событие для управления операцией закрытия. Предполагая, что процедура FileSave, используемая для сохранения файлов, уже существует, вы можете написать программу следующим образом.
SubForm_Unload (CancelAslnteger)
selectcastMsagbox("Сохранить данные?", 3 32)
'Да, нет, Cnacel три варианта
случай6'ДА
FileSave' сохранить данные
case2'отмена
Cancel=TRUE'Отменить операцию закрытия
caseelse'NO' не сохраняется, выполните операцию выключения
Конец выбора
EndSub
Переменная Cancel в приведенном выше коде является внутренней исходящей переменной самого события Form_unload. Она доставляет сообщения процессу управления Windows для управления направлением работы программы.
Приведенные выше три примера — это лишь некоторые незначительные проблемы в процессе совершенствования программного обеспечения. Чтобы сделать программное обеспечение стабильным и надежным, необходимо проделать большую и тщательную работу. Некоторые проблемы можно решить, изучив потенциал самого VB и глубоко овладев навыками управления некоторыми процессами, тогда как некоторые более сложные проблемы связаны с базовыми операциями Windows и могут быть легко реализованы с помощью функций Windows API; Конечно, для этого необходимо определенное понимание функций и механизмов Windows. По мере повышения уровня программирования для Windows мы постепенно будем учиться и использовать функции API для помощи в написании программы. ->