- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:「外部シンボルが未解決」について教えてください)
外部シンボルが未解決とは何ですか?リンクエラーなのでしょうか?
このQ&Aのポイント
- 「外部シンボルが未解決」とは、プログラム中で使用されている関数や変数が見つからないことを意味します。Windowsのプログラムで「外部シンボル 'MyCreateFontが未解決'」というメッセージが出た場合は、リンクエラーが発生している可能性があります。
- 外部シンボルが未解決と表示された場合、以下の処置を行うことが推奨されます: 1. 関連するヘッダーファイルやライブラリが正しくインクルードされているか確認する 2. リンカーオプションが正しく設定されているか確認する 3. 必要なライブラリがプロジェクトに追加されているか確認する 4. シンボルの定義が正しく行われているか確認する 5. コンパイラが正しい言語モードで動作しているか確認する
- これらの処置を行っても問題が解決しない場合は、他の原因(例:環境設定の問題)が考えられますので、詳細なエラーメッセージを確認するか、デバッグツールを使用して解析することをおすすめします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
★アドバイス ・MyCreateFont() 関数の実体のソースはどこにありますか?確認を。 ちなみに『外部シンボルが未解決』というのはリンクエラーですね。 エラーメッセージから TIMER.OBJ 内で MyCreateFont() 関数を呼び出しているようです。 よって、MyCreateFont() 関数の実体をどこにあるのか確認して下さい。 別のソースに記述されている場合は、そのソースファイルもコンパイルしてリンクさせます。 >HFONT MyCreateFont(int, DWORD, LPCTSTR); ↑この関数をコンパイルするソースに記述するなどすれば良いと思います。 ・以上。いろいろと確認をして下さい。→できたら全ソースを貼り付けてみて下さい。
その他の回答 (1)
- Oh-Orange
- ベストアンサー率63% (854/1345)
回答No.2
★回答 ・(1)…『プロトタイプ宣言』で正しいです。 ・(2)…サブ関数ですので main() には記述できません。よって、正しい解釈です。 ・(3)…基本的にはどこでも良い。でも、WM_PAINT で毎回、同じフォントを作成→削除を 繰り返すのならば、最初の WM_CREATE で HFONT ハンドルを作成して保存。その後に WM_PAINT で使う。WM_CLSOE で保存しておいた HFONT ハンドルを DeleteObject() する方が 良いと思います。ただ、フォント、ビットマップなど大量にリソースを消費するのもは作成 したら即、削除するほうが良いね。フォントの量にもよりますし、まぁ自由ですか。今回は。 ・以上。
質問者
お礼
アドバイス有難うございます。また的確なご指摘により、記述ミスを発見することが出来ました。一歩前進することが出来ました。 有難うございます。
補足
いつもアドバイスを頂き有難うございます。 ご指摘のように、MyCreateFont()関数の実体を確認したところ、記述していませんでした。 プログラムの一番最後に追加で記述すると無事に実行することが出来ました。(デジタル時計を作るプログラムです) 確認の意味での質問なのですが、 1、HFONT MyCreateFont(int, DWORD, LPCTSTR); は、プロトタイプ宣言 2、HFONT MyCreateFont(int nHeight, DWORDdwCharSet,LPCTSTRlpName) こちらは、MyCreateFont()関数の定義なので、『メイン関数の外で定義をする』と、理解していいのでしょうか? 3、またCreate○○と言う自作関数を呼び出す時のウィンドウメッセージは、WM_CREATEでも WM_PAINT でもいいのでしょうか? すべてのソースを貼り付けると文字数オーバーとなってしまうので、ウィンドウプロシージャの部分のみ張りつけます。よろしくお願いします。 //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id; HDC hdc; PAINTSTRUCT ps; static char szTime[64], szDate[64]; SYSTEMTIME st; HFONT hFont1, hFont2; switch (msg){ case WM_CREATE: SetTimer(hWnd, ID_MYTIMER, 500, NULL); //タイマの作成 break; case WM_TIMER: //関係ないタイマイベントは、DefWindowProcに任せる if (wp != ID_MYTIMER) return (DefWindowProc(hWnd, msg, wp, lp)); GetLocalTime(&st); wsprintf(szTime, "%02d:%02d:%02d", st.wHour, st.wMinute, st.wSecond); wsprintf(szDate, "%d年 %02d月 %02d日", st.wYear, st.wMonth, st.wDay); //クライアント領域全体を更新 InvalidateRect(hWnd, NULL, TRUE); SetWindowText(hWnd, szTime); break; case WM_LBUTTONDBLCLK: SendMessage(hWnd, WM_CLOSE, 0, 0); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); hFont1 = MyCreateFont(12, SHIFTJIS_CHARSET, "MS ゴシック"); SelectObject(hdc, hFont1); TextOut(hdc, 5, 5, szDate, (int)strlen(szDate)); hFont2 = MyCreateFont(30, ANSI_CHARSET, "MS ゴシック"); SelectObject(hdc, hFont2); SetTextColor(hdc, RGB(0, 0, 255)); TextOut(hdc, 10, 20, szTime, (int)strlen(szTime)); DeleteObject(hFont1); DeleteObject(hFont2); EndPaint(hWnd, &ps); break; case WM_CLOSE: id = MessageBox(hWnd, "終了してもよろしいですか", "確認", MB_YESNO | MB_ICONQUESTION); if (id == IDYES){ if (KillTimer(hWnd, ID_MYTIMER) == 0){ MessageBox(hWnd, "KILLTimer Error!", "Error", MB_OK | MB_ICONEXCLAMATION); } DestroyWindow(hWnd); } break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } //この関数を追加したら実行できました。 HFONT MyCreateFont(int nHeight, DWORD dwCharSet, LPCTSTR lpName) return(CreateFont(nHeight, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, dwCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, lpName)); }