소프트웨어 개발 과정에는 겉으로는 단순해 보이는 몇 가지 문제가 있지만 일반 개발자들은 이를 쉽게 무시합니다. 이러한 "버그"의 존재는 우리 소프트웨어의 상용화에 영향을 미칩니다. 아래에는 저자가 Visual Basic을 사용하여 소프트웨어를 개발할 때 직면한 몇 가지 문제가 나열되어 있으며 여기에는 모든 사람이 토론하고 교환할 수 있는 해결책이 나와 있습니다.
1. 애플리케이션이 두 번 로드되는 것을 방지합니다.
우리의 응용 프로그램이 Windows에서 실행 중일 때 작업 중에 때때로 이를 최소화하여 숨기거나 다른 작업을 위해 프로그램 관리자로 전환한 다음 원래 응용 프로그램으로 들어가고 싶은 경우 방금 시작한 응용 프로그램을 다시 시작하는 경우, 동일한 애플리케이션의 두 복사본이 동시에 메모리에 로드됩니다. 이는 메모리 공간을 차지할 뿐만 아니라 쉽게 오작동 및 데이터 손실을 초래합니다. 이런 일이 발생하지 않도록 하려면 프로그램에서 "이미 로드되었습니다"라는 메시지를 표시하거나 처음 로드된 응용 프로그램에 직접 들어갈 수 있어야 합니다. 이 문제는 해결하기 어려워 보입니다. 실제로 Windows 관리 응용 프로그램의 메커니즘을 이해하는 한 쉽게 해결할 수 있습니다.
우리는 실행 중인 각 응용 프로그램에 대해 Windows가 고유한 "핸들"과 모듈 코드(모듈)를 할당한다는 것을 알고 있습니다. 동일한 프로그램의 두 복사본이 동시에 실행되면 두 프로그램의 모듈 코드는 동일합니다. 따라서 메모리에서 두 개의 동일한 모듈 코드를 찾는 한 프로그램의 두 복사본이 실행되고 있음을 알 수 있습니다. 그리고 그것을 통제할 수 있다. Windows에서 제공하는 두 가지 인터페이스 함수 GetModuleHandle 및 GetModuleUsage를 사용하면 이 작업을 수행할 수 있습니다. 구체적인 방법은 다음과 같습니다. 먼저 새 모듈 파일(*.Bas)에 API 함수를 선언합니다.
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은 프로그램의 주요 형식입니다.
끝
ExitSub
오류메인:
lfErr<>0그런 다음
MsgBox가 프로그램을 시작하는 동안 오류가 발생했습니다. 64
ExitSub
끝
EndSub
프로세스가 완료된 후 VB3.0 주 메뉴 [옵션]에서 [프로젝트] 메뉴 항목을 선택하고 [StartupFrom] 항목을 Submain으로 설정합니다. 즉, 프로그램이 실행 중일 때 먼저 Submain 서브루틴에서 시작됩니다. . 그러면 위의 코드가 실행됩니다. Submain은 VB3.0에서 합의된 하위 프로세스 이름이며 다른 이름으로 대체될 수 없습니다.
EXE 파일을 다시 생성하고 프로그램 관리자에서 응용 프로그램을 시작한 다음 생성된 양식을 최소화한 다음 프로그램 관리자에서 실행하면 응용 프로그램이 로드된 후 두 번째 프로그램이 종료된다는 메시지 상자가 표시됩니다. 실행. 위 프로그램은 두 번째 프로그램이 로딩되는 것을 방지하기 위해서만 사용되며, 두 번째 프로그램을 시작할 수 없을 때 자동으로 첫 번째 프로그램에 진입하지 않습니다. 이를 달성하기 위해 관련된 절차는 비교적 복잡하므로 여기서는 자세히 소개하지 않습니다.
2. Windows 설치 경로 결정
우리가 개발하는 소프트웨어에서는 때때로 계산기, 플래너 등과 같이 Windows에서 제공하는 작은 응용 프로그램을 직접 호출하거나 Windows 또는 SYSTEM 경로에 일부 특수 파일을 넣어야 합니다. 일반적으로 Windows는 C:WINDOWS 디렉터리에 설치되지만 사용자는 Windows의 홈 디렉터리 이름을 임의로 수정할 수 있습니다. 따라서 우리 소프트웨어에서는 Windows의 설치 경로를 결정해야 합니다. 이 문제에 대해 Windows는 Windows 디렉터리와 SYSTEM 디렉터리의 이름을 반환할 수 있는 GetWindowsDirectory 및 GetSystemDirectory라는 두 가지 API 함수를 제공합니다.
이를 위해 Windows 설치 디렉터리의 이름을 반환하는 일반 함수 GetWinDir을 준비합니다. 마찬가지로 GetSysDir을 생략하여 작성할 수 있습니다.
*.BAS 모듈 파일에 API 함수 선언
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=윈더$
끝
EndFunction
그 중 ALLTRIM은 문자열에서 null 문자를 제거하는 데 사용되는 함수입니다.
함수ALLTrim(FatStr$)AsString
'thisFunctiondeleteSpacecharinstringofFatStr$
DimSlimStr$,I
SlimStr$=FatStr$
I=lnStr(SlimStr$,Chr$(0))'공간의 위치
IfIThenSlimStr$=왼쪽$(SlimStr$,I-1)
SlimStr$=Ltrim$(Rtrim$)(SlimStr$))
AIITrim$=SlimStr$
EndFunction
3. 양식을 닫기 전에 데이터를 저장하라는 메시지를 표시합니다.
일반적으로 애플리케이션을 종료하는 방법에는 일반적으로 5가지가 있습니다.
1. 사용자가 현재 폼의 컨트롤박스에서 [닫기] 명령을 선택합니다.
2. 프로그램에서 종료 명령 코드(예: 종료, 언로드)를 자극합니다.
3. 윈도우 종료
4. Windows 작업 목록에서 애플리케이션을 닫습니다.
5. 다중 문서 작업 중에 기본 MDI 양식을 닫으면 하위 MDI 양식도 닫힙니다.
애플리케이션을 닫기 전에 사용자에게 "데이터를 저장하시겠습니까?"라는 메시지를 표시하거나 "닫기" 작업을 취소할 수 있는 기회를 제공해야 합니다. VB에서는 양식을 닫으면 Form_Unload 이벤트가 트리거되어 "닫기" 작업을 제어하도록 프로그래밍할 수 있습니다. 파일을 저장하는 데 사용되는 FileSave 프로시저가 이미 있다고 가정하면 다음과 같이 프로그램을 작성할 수 있습니다.
SubForm_Unload(CancelAsInteger)
selectcastMsagbox("데이터를 저장하시겠습니까?", 3 32)
'예, 아니오, Cnacel 세 가지 옵션
사례6'예
파일저장' 데이터 저장
케이스2'취소
Cancel=TRUE'닫기 작업을 취소합니다.
Caseelse'NO'는 저장하지 않고 종료 작업을 수행합니다.
최종선택
EndSub
위 코드의 Cancel 변수는 Form_unload 이벤트 자체의 고유한 나가는 변수로, 프로그램의 방향을 제어하기 위해 Windows 제어 프로세스에 메시지를 전달합니다.
위의 세 가지 예는 소프트웨어 개선 과정에서 발생하는 사소한 문제일 뿐입니다. 소프트웨어를 안정적이고 신뢰할 수 있게 만들기 위해서는 많은 신중하고 신중한 작업이 수행되어야 합니다. 일부 문제는 VB 자체의 잠재력을 탐구하고 일부 프로세스의 운영 기술을 깊이 익히면 해결될 수 있지만, 일부 더 복잡한 문제는 Windows의 기본 작업과 관련되어 Windows API 기능을 사용하여 쉽게 실현될 수 있습니다. 물론 이를 위해서는 Windows의 기능과 메커니즘에 대한 어느 정도의 이해가 필요합니다. Windows 프로그래밍 수준이 향상됨에 따라 우리는 점차 프로그램 코딩을 완료하는 데 도움이 되는 API 기능을 배우고 사용하게 될 것입니다. ->