例として、呼び出し元がコールバック関数EnumWindowStations()
を渡す必要がある を見てみましょう。EnumWindowStationsProc()
コールバック関数は、現在のターミナル セッションのウィンドウ ステーションごとに 1 回呼び出されます。コールバック関数のシグネチャを見てみましょう。
BOOL CALLBACK EnumWindowStationProc(
_In_ LPTSTR lpszWindowStation,
_In_ LPARAM lParam
);
最初のパラメーターは、文字列データへのポインターです。その文字列バッファーは、コールバック呼び出し用に明示的に割り当てられましたか? また、コールバックが返された直後、または列挙関数が返される直前に解放されますか? または、文字列バッファーが割り当てられたままになり、後で使用できるように、ポインターはある種の永続メモリを指していますか?
これは重要なポイントです。永続的でない場合、たとえば、生のポインターをグローバル コンテナーに格納して、コールバックと完全な列挙プロセスが完了した後にアクセスするのは正しくないためです。代わりに、コールバックが戻る前に、基になる文字列データをアプリケーションによって制御されるバッファーにコピーする必要があります。
公式ドキュメントでは、文字列データの有効期間が明確にされていないようです。パラメータの説明には次の 1 行しかありません。
lpszWindowStation [入力]
ウィンドウ ステーションの名前。
また、ドキュメント ページのどこにも、文字列データの有効期間については記載されていません。また、この質問に「一度だけ」、つまり Windows API でのコールバック イディオムのすべての使用について答えている MSDN ページを見つけたことを思い出すこともできません。
現時点では、EnumWindowStations()
/のEnumWindowStationsProc()
ケースに最も関心がありますが、回答者が一般的なケース、つまりすべての Windows API コールバック関数について想定するものに対処するのが最善です。