ソフトウェアの開発プロセスには、一見単純な問題がいくつかありますが、一般の開発者には簡単に無視されます。これらの「バグ」の存在は、ソフトウェアの商用化に影響を与えます。 Visual Basic を使用してソフトウェアを開発する際に著者が遭遇したいくつかのそのような問題を以下に示します。ここでは、全員が議論して交換できるように、その解決策を示します。
1. アプリケーションが二度読み込まれないようにする
Windows でアプリケーションを実行しているとき、操作中にアプリケーションを最小化して非表示にしたり、他の操作のためにプログラム マネージャーに切り替えたりして、元のアプリケーションに入りたくなることがあります。それを忘れた場合は、起動したばかりのアプリケーションを再起動します。同じアプリケーションの 2 つのコピーが同時にメモリにロードされるため、メモリ領域が占有されるだけでなく、誤操作やデータ損失が発生しやすくなります。これを防ぐには、プログラムは「すでにロードされています」というプロンプトを表示するか、初めてロードされるアプリケーションに直接入力できる必要があります。この問題は解決するのが難しそうに見えますが、実は Windows 管理アプリケーションの仕組みを理解していれば簡単に解決できます。
実行中のアプリケーションごとに、Windows が固有の「ハンドル」とモジュール コード (モジュール) を割り当てることがわかっています。同じプログラムの 2 つのコピーが同時に実行される場合、2 つのプログラムのモジュール コードは同じです。したがって、メモリ内で 2 つの同一のモジュール コードが見つかる限り、プログラムの 2 つのコピーが実行されていることがわかります。そしてそれをコントロールできるのです。 Windows が提供する 2 つのインターフェイス関数 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 番目のプログラムが終了したことを通知するメッセージ ボックスが表示されます。実行。上記のプログラムは、2 番目のプログラムのロードを防ぐためにのみ使用されますが、2 番目のプログラムが起動できない場合に、最初のプログラムに自動的に入るわけではありません。これを達成するために必要な手順は比較的複雑なので、ここでは詳しく説明しません。
2. Windows のインストール パスを決定します。
私たちが開発するソフトウェアでは、電卓やプランナーなどの Windows が提供する小さなアプリケーションを直接呼び出す場合や、Windows または SYSTEM パスに特別なファイルを置く必要がある場合があります。通常、Windows は C:WINDOWS ディレクトリにインストールされますが、Windows のホーム ディレクトリ名はユーザーが自由に変更できるため、本ソフトウェアでは Windows のインストール パスを決定する必要があります。この問題に対して、Windows では、Windows ディレクトリと SYSTEM ディレクトリの名前を返すことができる GetWindowsDirectory と GetSystemDirectory という 2 つの API 関数を提供しています。
このために、Windows インストール ディレクトリの名前を返す汎用関数 GetWinDir を準備します。同様に、省略して GetSysDir と書くこともできます。
*.BAS モジュール ファイルで API 関数を宣言する
DeclareFunctionGetWindowsDirectoryLibKernel(ByValipBufferAsString,ByValnSizeAsInteger)asIntegerFunctionGetWinDir()AsStringDimWindir$Windir$=Space$(144)'144 は、WINDOWS ディレクトリ名の理論上の最大長です。
lfGetWindowsDirectory(Windir$,144)=0その後
MsgBox は WINDOWS、16 のインストール パスを特定できません
GetWinDir=
それ以外
ウィンディル$=ALLトリム$(ウィンディル$)
ifRight$(Windir$,1)<>“/”thenWindir$=Windir$“/”
'バックスラッシュを追加
GetWinDir=ウィンディル$
エンドルフ
エンドファンクション
このうち、ALLTRIM は文字列内の NULL 文字を削除するために使用される関数です。
FunctionALLTrim(FatStr$)AsString
'thisFunctiondeleteSpacecharinstringofFatStr$
ディムスリムストラ$,I
SlimStr$=FatStr$
I=lnStr(SlimStr$,Chr$(0))'スペースの位置
IfIThenSlimStr$=Left$(SlimStr$,I-1)
SlimStr$=Ltrim$(Rtrim$)(SlimStr$))
AIITrim$=スリムStr$
エンドファンクション
3. フォームを閉じる前にデータを保存するかどうかを確認するプロンプトを表示する
一般的に、アプリケーションを閉じるには通常 5 つの方法があります。
1. ユーザーが現在のフォームのコントロールボックスで [閉じる] コマンドを選択します。
2. プログラム内の終了コマンド コード (End、Unload など) を刺激します。
3. Windowsを終了します
4. Windows タスク リストのアプリケーションを閉じます。
5. マルチドキュメント操作中にメイン MDI フォームを閉じると、サブ MDI フォームも閉じられます。
アプリケーションを閉じる前に、ユーザーに「データを保存しますか?」というメッセージを表示するか、「閉じる」操作をキャンセルする機会を与える必要があります。 VB では、フォームを閉じると Form_Unload イベントがトリガーされ、このイベントをプログラムして「閉じる」操作を制御できます。ファイルを保存するために使用されるプロシージャ FileSave がすでに存在すると仮定すると、次のようにプログラムを書くことができます。
SubForm_Unload(CancelAsInteger)
selectcastMsagbox("データを保存しますか?", 3 32)
「はい、いいえ、3 つのオプションを選択してください」
case6'はい
「FileSave」のセーブデータ
case2'キャンセル
Cancel=TRUE'閉じる操作をキャンセルします
caseelse'NO' は保存せず、シャットダウン操作を実行します
エンドセレクト
EndSub
上記のコードの Cancel 変数は、Form_unload イベント自体の固有の送信変数であり、プログラムの方向を制御するために Windows 制御プロセスにメッセージを送信します。
上記の 3 つの例は、ソフトウェアの改善の過程における小さな問題のほんの一部にすぎません。ソフトウェアを安定して信頼できるものにするためには、多くの注意深い作業を行う必要があります。一部の問題は、VB 自体の可能性を探求し、一部のプロセスの操作スキルを深く習得することで解決できますが、より複雑な問題には Windows の基礎となる操作が関係しており、Windows API 関数を使用して簡単に実現できます。もちろん、これには Windows の機能や仕組みをある程度理解する必要があります。 Windows プログラミングのレベルが向上するにつれて、プログラムのコーディングを完了するのに役立つ API 関数を徐々に学び、使用するようになります。 ->