- ベストアンサー
VC++2005でのリソースコンパイルエラーについて
よろしくお願いします。 猫でもわかる…… を参考にしながら、C言語でスクリーンセイバーを作成しています。 BCCForm and Skelton で作成したリソースをVC++2005で利用してます。 『設定のためのダイアログボックスを表示しないスクリーンセイバー』 はうまく行ったのですが、 『設定用ダイアログボックスを表示させるプログラム』 ではエラーが出てしまいます。 WS_EX_DLGMODALFRAME この部分が良くないらしいのですが、コメントアウトしてみたり、 削除してみたり、記述を変えたりしたのですが、うまくコンパイルしてくれません。 詳しい方、アドバイスをお願いします。 //----------------------------------------- // BCCForm Ver 2.41 // An Easy Resource Editor for BCC // Copyright (c) February 2002 by ysama //----------------------------------------- #include "Resscreensav.h" //---------------------------------- // ダイアログ (DLG_SCRNSAVECONFIGURE) //---------------------------------- DLG_SCRNSAVECONFIGURE DIALOG DISCARDABLE 0, 0, 270, 180 EXSTYLE WS_EX_DLGMODALFRAME | WS_EX_APPWINDOW STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX CAPTION "設定" FONT 8, "MS 明朝" { CONTROL "表示間隔", IDC_STATIC, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 24, 18, 63, 15 CONTROL "表示文字列", IDC_STATIC, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 24, 54, 63, 15 CONTROL "表示回数", IDC_STATIC, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 27, 93, 63, 15 CONTROL "", IDC_EDIT1, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 102, 18, 102, 15 CONTROL "", IDC_EDIT2, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 102, 51, 102, 15 CONTROL "", IDC_EDIT3, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL | ES_LEFT, 105, 90, 102, 15 CONTROL "OK", IDOK, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 18, 144, 69, 15 CONTROL "キャンセル", IDCANCEL, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 165, 144, 69, 15 } //-------------------------- // イメージ(MYBMP) //-------------------------- MYBMP BITMAP DISCARDABLE "C:\My Pictures\scan1\scan5.bmp" //-------------------------- // イメージ(ID_APP) //-------------------------- ID_APP DISCARDABLE "icon1.ico" //----------------------------------------- // BCCForm Ver 2.41 // Header File for Resource Script File // Copyright (c) February 2002 by ysama //----------------------------------------- //--------------------- // ダイアログリソース //--------------------- // ダイアログ DLG_SCRNSAVECONFIGURE #define IDC_STATIC 100 #define IDC_EDIT1 103 #define IDC_EDIT2 104 #define IDC_EDIT3 105 #define DLG_SCRNSAVECONFIGURE 2003 //--------------------- // メニューリソース //--------------------- //--------------------- // イメージリソース //--------------------- //#define MYBMP 200 //#define ID_APP 100 //--------------------- // ストリングテーブル //--------------------- //-------------------- // アクセラレーター //-------------------- //------------------ // ヴァージョン情報 //------------------ ------ ビルド開始: プロジェクト: screensav, 構成: Release Win32 ------ リソースをコンパイルしています... ..\..\..\..\Bitmap\screensav\screensav.rc(12) : error RC2104 : undefined keyword or key name: WS_EX_DLGMODALFRAME ビルドログは "file://c:\Visual Studio 2005\Projects\screensav\screensav\Release\BuildLog.htm" に保存されました。 screensav - エラー 1、警告 0 ========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
たぶん インクリメンタルリンクまたはインクリメンタルコンパイルが悪さをしているのでしょう インクリメンタルリンクやインクリメンタルコンパイルは変更箇所のみに対して コンパイルやリンクを行う機能です これにより コンパイル時間やリンク時間の短縮を図っています しかし 何かの原因で ファイルのタイムスタンプなどが狂ってしまうとこれがうまく機能しなくなります 他から持ってきたソースの場合タイムゾーンの指定などが無いなど環境依存の設定から変な動作になる場合がありますよ そのような場合 リビルドやクリアなどをして コンパイル・リンクを最初からやり直すとうまくいく場合があります
その他の回答 (4)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★もう回答がありますね。 ・『exe』ファイルを削除しても『*.obj』ファイルやリソース『*.res』ファイルがあると 『exe』ファイルが直ぐに作られることがあります。でもリソースファイルを編集していて IDが変わっているとこの『exe』は正しく実行もされません。そこで再コンパイルするとき 私の場合は明示的に『*.exe』『*.obj』『*.res』『BuildLog.htm』などを削除してから コンパイルします。 ・今回はリソースファイルを編集した後にソースファイルをコンパイルしないでリンクだけ 行う処理が起こったと思います。本当ならリソースファイルのタイムスタンプを元に ソースファイルも再コンパイルされないといけなかったのかもしれません。 ・今はVC++2005の総合環境を使っていますが、前は BCC のコンパイラをフリーソフトの 総合環境と組み合わせて使っていたのでしょうね。この場合はリソースもVC++2005に 合わせた内容に変更すべきです。変更方法はVC++2005で新規プロジェクトを作成して 新しくリソースファイルを作成させます。その後にリソースファイル『*.rc』を エディタで開いて BCC で使っていたリソースで重要な部分をVC++2005で自動的に 作成されたリソースファイル『*.rc』に移し変えれば良いでしょう。 特に最初この質問を読んだときリソースファイルに『#include <windows.h>』がない。 だからフリーの総合環境を使って作られたリソースだと思いました。でもフリーの 総合環境は使ったことがなかったのでアドバイスしなかったのです。 その後に回答者 No.1 さんがアドバイスしてリソースはコンパイルできたようですね。 でも『*.obj』ファイルが正しくなかったのでしょうね。 リンク時に未解決エラーになったようです。 ・以上。これからVC++2005の総合環境を使うときには気をつけて下さい。
お礼
貴重なアドバイス有難うございます。 コンパイル一つにも、色々なことが起こることがわかりました。 これからは、アドバイスしていただいたことを参考にして、コンパイルをしてみたいと思います。 本当に有難うございました。 これで閉め切らさせていただきます。
- redfox63
- ベストアンサー率71% (1325/1856)
ダイアログつきのプロジェクト(ソリューション)を読み込み 表示 > オブジェクトブラウザ で表示されるウィンドウの 左ペインで 作成中のプロジェクトを探し クリックします 右側が変化します これで このプロジェクトで作成されている関数や使われている変数などを表示することが出来ます 同じ要領で ダイアログなしのプロジェクトも確認します どこかに違いがありませんか? 当然 ダイアログ関連の違いは無視するとしてですが …
お礼
御礼が遅くなってしまい、すみません。 アドバイスのとおり、関数や、変数を調べてみましたが、以上はありませんでした。そこで、最初のアドバイスを思い出し、 #include "Resscreensav.h" #include <windows.h> #include <scrnsave.h> #include <windowsx.h> と、追加してみました。 ビルドの結果は 『screensav - エラー 0、警告 5 ========== ビルド: 1 正常終了、0 失敗、0 更新、0 スキップ』 で、警告が5個ありましたが、成功しました。 不思議なのですが、このとき作られた『screensav.exe』ファイルを削除した後、もう一度ビルドをしてみました。 ------ ビルド開始: プロジェクト: screensav, 構成: Release Win32 ------ リンクしています... コード生成しています。 コード生成が終了しました。 マニフェストを埋め込んでいます... ビルドログは "file://c:\Visual Studio 2005\Projects\screensav\screensav\Release\BuildLog.htm" に保存されました。 screensav - エラー 0、警告 0 ========== ビルド: 1 正常終了、0 失敗、0 更新、0 スキップ ========== 今度は、エラーも、警告もなくなってしまいました。 原因はよく分からないのですが、『BCC用のリソースエディタ』で作ったりソースを、VC++で使うと、『相性』の関係でこのようなことが起こるのかもしれないと思っています。 結果、今は正常に動いています。 アドバイス有難うございました。 それから、Oh-Orangeさんの回答をいただいた後に、締め切りたいと思います。
補足
度々のアドバイス有難うございます。 早速試してみたいと思います。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス ・エラーメッセージの意味は scrnsave.c ソースに (1)ScreenSaverProc (2)ScreenSaverConfigureDialog (3)RegisterDialogClasses が存在しないようです。 今度はソースファイルを補足に貼り付けてみて下さい。 リソースは問題ないと思います。 ・以上。補足要求です。
お礼
BOOL WINAPI ScreenSaverConfigureDialog( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static HWND hSpeed, hText, hNo; char szBuf[64]; DWORD dwResult, dwType, dwSize; switch (msg){ case WM_INITDIALOG: hSpeed = GetDlgItem(hDlg, IDC_EDIT1); //設定ダイアログの初期化 hText = GetDlgItem(hDlg, IDC_EDIT2); hNo = GetDlgItem(hDlg, IDC_EDIT3); RegCreateKeyEx(HKEY_CURRENT_USER, "Control Panel\\Screen Saver.screensv02", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hMyKey, &dwResult); dwSize = (DWORD)sizeof(DWORD); RegQueryValueEx(hMyKey, "Speed", NULL, &dwType, (LPBYTE)&nSpeed, &dwSize); dwSize = (DWORD)sizeof(szText); RegQueryValueEx(hMyKey, "Text", NULL, &dwType, (LPBYTE)szText, &dwSize); dwSize = (DWORD)sizeof(DWORD); RegQueryValueEx(hMyKey, "No", NULL, &dwType, (LPBYTE)&nNo, &dwSize); Edit_SetText(hText, szText); itoa(nSpeed, szBuf, 10); Edit_SetText(hSpeed, szBuf); itoa(nNo, szBuf, 10); Edit_SetText(hNo, szBuf); if(RegCloseKey(hMyKey) != ERROR_SUCCESS) MessageBox(hDlg, "RegCloseKeyに失敗しました", "ERROR", MB_OK); break; case WM_COMMAND: switch(LOWORD(wParam)){ case IDOK: Edit_GetText( hSpeed, szBuf, (int)sizeof(szBuf) - 1); nSpeed = atoi(szBuf); Edit_GetText( hText, szText, (int)sizeof(szText) - 1); Edit_GetText( hNo, szBuf, (int)sizeof(szBuf) - 1); nNo = atoi(szBuf); もう少しあるのですが、貼り付けられませんでした
補足
アドバイス有難うございます。 今、エラーメッセージについて色々調べているところです、何かお気づきの所がありましたら、よろしくお願いします。 //screensav02.cpp レジストリに設定する #include <windows.h> #include "Resscreensav.h" #include <scrnsave.h> #include <windowsx.h> #define ID_TIMER 100 HKEY hMyKey; UINT nSpeed, nNo; char szText[64]; LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc, hdc_mem; int x, y, r, g, b, w, h; int nTextw, nTexth; static n; static RECT rc; HFONT hFont; SIZE s; HBITMAP hBmp; BITMAP bmp; DWORD dwResult, dwSize, dwType; switch(msg){ case WM_CREATE: //レジストリの調査 RegCreateKeyEx(HKEY_CURRENT_USER, "Control Panel\\Screen Saver.screensv02", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,NULL, &hMyKey, &dwResult); if(dwResult == REG_CREATED_NEW_KEY){ nSpeed = 300; RegSetValueEx(hMyKey, "Speed", 0, REG_DWORD, (LPBYTE)&nSpeed, sizeof(DWORD)); strcpy(szText, "設定スクリーンセーバー"); RegSetValueEx(hMyKey, "Text", 0, REG_SZ, (LPBYTE)szText, (DWORD)strlen(szText) + 1); nNo = 20; RegSetValueEx(hMyKey, "No", 0, REG_DWORD, (LPBYTE) &nNo, (DWORD)sizeof(DWORD)); }else{ dwSize = (DWORD)sizeof(DWORD); RegQueryValueEx(hMyKey, "Speed", NULL, &dwType, (LPBYTE)&nSpeed, &dwSize); dwSize = sizeof(szText); RegQueryValueEx(hMyKey, "Text", NULL, &dwType, (LPBYTE)szText, &dwSize); dwSize = (DWORD)sizeof(DWORD); RegQueryValueEx(hMyKey, "No", NULL, &dwType, (LPBYTE)&nNo, &dwSize); } if(RegCloseKey(hMyKey) != ERROR_SUCCESS) MessageBox(hWnd, "RegClosekeyに失敗しました", "Error", MB_OK); SetTimer(hWnd, ID_TIMER, nSpeed, NULL); GetClientRect(hWnd, &rc); break; case WM_TIMER: if(wParam != ID_TIMER) break; hdc = GetDC(hWnd); hFont = CreateFont(24, //デバイスコンテキストハンドルの取得とフォントの作成 0, //文字幅 0, //テキストの角度 0,//ベースラインとx軸の角度 FW_REGULAR,//フォントの重さ(太さ) FALSE,//イタリック体 FALSE,//アンダーライン FALSE,//打消し線 SHIFTJIS_CHARSET,//文字セット OUT_DEFAULT_PRECIS,//出力精度 CLIP_DEFAULT_PRECIS,//クリッピング精度 PROOF_QUALITY,//出力品質 FIXED_PITCH | FF_MODERN,//ピッチとファミリ "MS ゴシック"); SelectObject(hdc, hFont); GetTextExtentPoint32(hdc, szText,(int)strlen(szText), &s); nTextw = s.cx; nTexth = s.cy; hBmp = LoadBitmap(hMainInstance, "MYBMP"); // hMainInstanceこれ何? 調べる GetObject(hBmp, (int)sizeof(BITMAP), &bmp); w = bmp.bmWidth; h = bmp.bmHeight; hdc_mem = CreateCompatibleDC(hdc); SelectObject(hdc_mem, hBmp); x = (rand() % rc.right) - (nTextw + w) / 2; y = rand() % rc.bottom; r = rand() % 256; g = rand() % 256; b = rand() % 256; BitBlt(hdc, x, y, w, h, hdc_mem, 0, 0, SRCCOPY); SetBkMode(hdc, TRANSPARENT); SetTextColor(hdc, RGB(r, g, b)); TextOut(hdc, x + w, y + (h - nTexth) / 2, szText, (int)strlen(szText)); n++; if(n > (int)nNo){ n = 0; PatBlt(hdc, 0, 0, rc.right, rc.bottom, WHITENESS); //BLACKNESSから変更してみた } DeleteObject(hBmp); DeleteDC(hdc_mem); DeleteObject(hFont); ReleaseDC(hWnd, hdc); break; case WM_DESTROY: KillTimer(hWnd, ID_TIMER); PostQuitMessage(0); break; default: break; } return DefScreenSaverProc(hWnd, msg, wParam, lParam); }
- redfox63
- ベストアンサー率71% (1325/1856)
#include "windows.h" を #include "Resscreensav.h"の後ろに挿入してみてください 拡張Windowスタイルの定義などWindowsの定義ファイルを読み込んでいないのが原因ではないかと思います
補足
アドバイス有難うございます。 ご指摘のとおり、 #include "windows.h" を追加したところ、前回のようなエラーはでなくなったのですが、今度は次のようなエラーが出るようになりました。 #include <windows.h> 等、 色々試しているのですが今の所成功していません。 何かお気づきでしたら、アドバイスをお願いします。 ------ ビルド開始: プロジェクト: screensav, 構成: Release Win32 ------ リンクしています... ScrnSave.Lib(scrnsave.obj) : error LNK2001: 外部シンボル "_ScreenSaverProc@16" は未解決です。 ScrnSave.Lib(scrnsave.obj) : error LNK2001: 外部シンボル "_ScreenSaverConfigureDialog@16" は未解決です。 ScrnSave.Lib(scrnsave.obj) : error LNK2001: 外部シンボル "_RegisterDialogClasses@4" は未解決です。 C:\Visual Studio 2005\Projects\screensav\Release\screensav.exe : fatal error LNK1120: 外部参照 3 が未解決です。 ビルドログは "file://c:\Visual Studio 2005\Projects\screensav\screensav\Release\BuildLog.htm" に保存されました。 screensav - エラー 4、警告 0 ========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========
お礼
貴重なアドバイス有難うございます。 コンパイル一つにしても、色々なことがあるのですね。とても参考になりました。 これからは、今までのアドバイスを参考にしたいと思います。 本当に有難うございました。 これで閉め切らさせていただきます。