掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
MessageBox (ID:52719)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
このスレッドも長くなりすぎたかな。 内容も MessageBox から スレッドの使い方になってるし。 質問スレッド立て直したほうがよいかも。 # H"32K なんでダウンロードが重いだけ(^^; >> CreateThread(NULL,0,ThreadFunc,(LPVOID)bContinue,0,&dwID); 改悪しちゃだめですよ。 (LPVOID)&bContinue; DWORD WINAPI ThreadFunc(LPVOID *pParam) { // >> VBばかりやっていると // もろ VB ですねー、括弧がない。 //>> if MessageBox() == MB_OK if( MessageBox() == MB_OK ) { // 1つだけ改善されているけど //>> pParam = 0; *pParam = 0; } return 0; } 私が書くと次のようになりました。 /////////////////////////////////////////////////////// typedef struct tagSem ssem; struct tagSem { BOOL m_bContinue; void * m_pVoid1; void * m_pVoid2; } g_Sem; DWORD WINAPI ThreadProcMessageBox( LPVOID lpParameter // スレッドのデータ ) { ssem * pSem = (ssem *)lpParameter; if(( pSem ) && ( pSem->m_pVoid1 == (void *)pSem )) { pSem->m_pVoid2 = pSem; // ちょっとした実験をした。(アセンブラによる割り込み禁止) // 例外処理 (初回) は p03.exe にあります: 0xC0000096: Privileged Instruction。 // __asm // { // cli // } MessageBox( NULL, "ここを押して", "なーめ", MB_ICONINFORMATION ); pSem->m_bContinue = FALSE; // いらないかも知れないが... ExitThread( 0 ); } else { // 渡されたアドレスがNULLまたは渡したアドレスと違う場合。 __asm { int 3; // Debug Break; } } return( 0 ); } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // TODO: この位置にコードを記述してください。 MSG msg; HACCEL hAccelTable; // グローバル ストリングを初期化します LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_P03, szWindowClass, MAX_LOADSTRING); MyRegisterClass( hInstance ); // アプリケーションの初期化を行います: if( !InitInstance( hInstance, nCmdShow ) ) { return FALSE; } ////////////////////////////////////////////////// DWORD dwThID; g_Sem.m_pVoid1 = &g_Sem; // アドレスチェック用 g_Sem.m_pVoid2 = NULL; g_Sem.m_bContinue = TRUE; int nCnt = 0; char s[1024]; HANDLE hTh = CreateThread( NULL,0,ThreadProcMessageBox, &g_Sem, 0, &dwThID ); OutputDebugString( "Running.\n"); Sleep( 1 ); // これを入れないと MessageBox の出現が遅くなる。 if( hTh ) { while( g_Sem.m_bContinue ) { // デバッグ窓にカウントを出力 sprintf( s, "COUNT= %d\n", nCnt++ ); OutputDebugString( s ); } } WaitForSingleObject( hTh, INFINITE ); CloseHandle( hTh ); // 念のためアドレス確認 if( g_Sem.m_pVoid1 != g_Sem.m_pVoid2 ) { sprintf( s, "GSEM: %08X,PSEM: %08X.\n", g_Sem.m_pVoid1, g_Sem.m_pVoid2 ); OutputDebugString( s ); __asm { int 3; } } ////////////////////////////////////////////////// あと省略(自動生成されたまま)。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.