2 つのコード ファイルがあり、1 つにはWinMain()
関数が含まれており、すべての関数はメイン ダイアログ ウィンドウに関連しています。もう 1 つは、プログラムに関連するスレッド コールバックと変数関数を含みます。HWND hWnd = NULL
MainDlg.cpp でグローバル変数として定義しextern HWND hWnd
、Other.cpp (スレッド コールバックを含む) で定義しました。WM_INITDIALOG
メッセージがウィンドウに送信されると、スレッドが作成されます。スレッド コールバック内では、hWnd
長い操作が実行されるまで変数は null であり、その後は使用可能になります。
MainDlg.cpp
HWND hWnd = NULL;
HANDLE hListenThread = NULL;
DWORD WINAPI ListenThread( LPVOID lpvParam );
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
/* ... */
if( NULL == (hWnd=CreateDialog( hInstance, MAKEINTRESOURCE(IDD_MAINDLG), NULL, (DLGPROC)WndProc)) )
{
MessageBox( NULL, "Error creating the main dialog!", NULL, MB_OK | MB_ICONERROR );
return -1;
}
MSG msg;
while( GetMessage(&msg,NULL,0,0) && IsWindow(hWnd) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
BOOL CALLBACK WndProc(HWND hWndDlg, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch(Message)
{
case WM_INITDIALOG:
{
DWORD dwListenThreadId = NULL;
/* referencing hWnd here works fine... */
/* ... */
hListenThread = CreateThread(
NULL,
0,
ListenThread,
hWndDlg,
0,
&dwListenThreadId);
/* ... */
} break;
}
return false;
}
その他.cpp
extern HWND hWnd;
DWORD WINAPI ListenThread( LPVOID lpvParam )
{
if( hWnd == NULL )
MessageBox( NULL, "hWnd == NULL", NULL, MB_OK | MB_SYSTEMMODAL );
if( hWnd != NULL )
MessageBox( NULL, "hWnd != NULL", NULL, MB_OK | MB_SYSTEMMODAL );
return 0;
}
ListenThread
アプリケーションが起動されると、コールバック内の両方のメッセージ ボックスが表示されます。なぜこれが起こっているのか誰か教えてもらえますか?の冒頭で行う以外に、これを修正するためにできることはありますか?while( hWnd == NULL );
ListenThread