プロが教える店舗&オフィスのセキュリティ対策術

VC++2005Express版+WIN32SDK+猫でもわかるWindowsプログラミング2で、勉強中ですが、スクリーンセーバーのプログラムでリンクエラーが発生して解決できないでいます。http://www.kumei.ne.jp/c_lang/net2005/sample.htmを元に、書籍を見ながら自分で打ち込んでトライしているのですが、「ScrnSave.Lib(scrnsave.obj) : error LNK2019: 未解決の外部シンボル _RegisterDialogClasses@4 が関数 _DoConfigBox@4 で参照されました。」というリンクエラーが発生します。文字セットはマルチバイトに設定してあります(上記サンプルコードはUNICODE対応ですが、書籍の方はそうでないので、楽な道に走っております)。WEBで_RegisterDialogClasses等で検索すると中国語の記事が沢山ヒットしますが、日本語、英語は少数しかヒットしないので、文字コードの関係もあるのでしょうか?ダメ元でScrnSavw.Libをリンクしたりしてみましたが、当然NGでした。ソースコードの入力ミスはつぶしたつもりですが、上述の様にWEBと書籍の記事の合体です。アドバイスをお願いいたします。

A 回答 (4件)

★原因判明。


・関数名が違います。
 間違い⇒ResisterDialogClasses
 正しい⇒RegisterDialogClasses
 ※『s』ではなくて『g』です。
・あと『ComCtl32.lib』もインポートして下さい。
 これはスクリーンセーバーで『InitCommonControlsEx』関数が必要だからです。
・以上。
    • good
    • 0
この回答へのお礼

ありがとうございました。
ご指摘の通り、修正すると問題なくビルドできました。タイプミスがこういう形で影響してくる事があるのですね。当然何度もコードは見直しましたが、発見できませんでした。(英語力の無さを露呈?)
C、C++のこの辺の仕組みは理解できておりません。
また、ComCtl32.libは、タイマーコントロールを使っているので必要なのかと思っていましたが、ご指摘の様な意味があるのですね。勉強になります。
おかげさまで、猫Win2の後半に進めます。
皆様、あまり役に立たない質問履歴を残してしまって、申し訳ありませんでした。

お礼日時:2007/10/19 23:16

★確認。


・ヘッダファイルとして『scrnsave.h』をインクルードして
 インポートライブラリとして『scrnsave.lib』をプロジェクトに加えていますか?
 もしかしたら『scrnsave.lib』ファイルが存在しないとか。
 http://www13.plala.or.jp/kmaeda/winc/saver1.htm→『Screen Saver 入門』
 http://www.6809.net/tenk/html/prog/scrnsvr.htm→『CでWin9xのスクリーンセーバーを作ってみる』
・次のリンクも参考にして下さい。
 http://sysneitf.hp.infoseek.co.jp/screensaver.html→『Screen Saver スクリーンセーバー』
>WEBで_RegisterDialogClasses等で検索すると中国語の記事が沢山ヒットしますが、
>日本語、英語は少数しかヒットしないので、文字コードの関係もあるのでしょうか?
 ↑
 検索エンジンは何を使っていますか?
 私は google を普段使っています。
 Web で『RegisterDialogClasses』キーワードを元に検索するとたくさん見つかりますよ。
 列挙すると
 http://www7a.biglobe.ne.jp/~tsuneoka/win32sub2/4 …→『自動的にログオフを行うスクリーンセーバーの作り方がわかりたい』
 http://www.kumei.ne.jp/c_lang/sdk2/sdk_127.htm→『第127章 スクリーンセーバー その1』
 http://www.kumei.ne.jp/c_lang/sdk2/sdk_128.htm→『第128章 スクリーンセーバー その2』
 http://www.kumei.ne.jp/c_lang/sdk2/sdk_129.htm→『第129章 スクリーンセーバー その3』
 http://loafer.jp/mixi/diary/class.xsp?2007-08-19 …→『関数の実装』
 http://hp.vector.co.jp/authors/VA030421/try7s12. …→『スクリーンセーバーの作り方』
 http://www.syuhitu.org/other/schp.html→『スクリーンセーバー作成』
 http://www13.plala.or.jp/kmaeda/winc/saver1.htm→『Screen Saver 入門』
 http://www.h4.dion.ne.jp/~fht/wptips/screensaver …→『スクリーンセーバーを作成する』
 http://www.6809.net/tenk/html/prog/scrnsvr.htm→『CでWin9xのスクリーンセーバーを作ってみる』
 http://www.dinop.com/vc/screensaver.html→『スクリーンセーバーの作成』
 http://www.winapi-database.com/special/2002_6/in …→『スクリーンセーバーを作ってみよう』
 http://www.cnet-try.ne.jp/akiji/w32a09.htm→『スクリーンセーバーを作ろう』
 http://monjyu.biz/monjyu/bord/sen1/msg/165.html→『この関数が必要なのか?』
 http://mymio.jugem.jp/?cid=19→『VC++6.0 でスクリーンセーバー』
 こんな感じで日本語サイトが見つかります。
 ちなみに『_』下線文字が付いた『_RegisterDialogClasses』を検索してはいけません。
 VC ではライブラリ(DLL)などの関数名の先頭に『_』下線文字を付けるので。
 下線文字を付けると確かにあまり検索されませんね。
 API 関数名の先頭の下線文字を取り除いて検索すると良いです。
・以上。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
なにぶん、猫Win2を半分くらいまで読み進んだところで、Text通りに打ち込んで訳の分からないエラーが出てしまってお手上げ状態です。どうせスクリーンセーバーなんか作らないからと、パスしたい誘惑に駆られつつ、それでも何とか出来ないかと質問させていただきました。
ご指摘の通り、RegisterDialogClassesでも検索してみたのですが(シンプルなのが気に入って、当方もGoogleを愛用しています)情報の幅が広すぎて、当方のスキルでは有用な情報を拾い出す事ができませんでした。
余分な物を削っていったコードをA No.1の方に補足させていただきました。ご指摘のscrnsave.hのインクルードと、scrnsave.libのインポートはしています。ご検討いただけると幸いです。

お礼日時:2007/10/18 22:50

書き忘れ『ScreenSaverConfigureDialog』も必須でしたm(__)m

    • good
    • 0

スクリーンセーバーのサンプルとして お示しのサイトを手本にやっておられるのですか?


『ScrnSave.lib』にWinMainとかも含まれていますが ・・・
ご自分で書かれてコードの中に RegisterDialogClass関数はあるのでしょうか

スクリーンセーバーでは
『RegisterDialogClass』『ScreenSaverProc』この2つの関数は必須で自前で用意しなくてはいけません
DoConfigBoxについてはたぶん独自のスクリーンセーバー構成用ダイアログ関連の関数(コールバック関数かも)なのでしょう
これも自前で用意することになります

RegisterDialogClassは構成ダイアログ使う特殊な設定が必要な場合に使いますがそうでないなら TRUEを返す関数を定義すればいいでしょう

ちなみに『ScrnSavw.lib』はUNIICODE用なので当然NGです

# 質問文などは適宜改行しましょう
# 読みにくい質問になりますよ
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。追加検討していて、お礼が遅れて申し訳ありません。
サイトからは、vc++2005対応のひな形を利用しているだけで、付加する部分は猫Win2の書籍を見て、打ち込んでいます。
チェックするために余分な物を削っていったら、下記の通りになりましたが、相変わらず同じリンクエラーがでます。
scrnsave.libと、comctl32.lib(下記コードには無いがタイマを使うため)をリンクしています。(プロジェクトに既存の項目で追加)。ご指摘の点は満足していると思います。(書籍の内容通りですが)。ご検討をお願いします。
#include <windows.h>
#include <scrnsave.h>

LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CREATE:
break;
case WM_TIMER:
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
break;
}
return DefScreenSaverProc(hWnd, msg, wParam, lParam);
}
BOOL WINAPI ScreenSaverConfigureDialog(
HWND hDlg, UINT msg, WPARAM wParam,LPARAM lParam)
{
return TRUE;
}

BOOL WINAPI ResisterDialogClasses(HANDLE hInst)
{
return TRUE;
}

お礼日時:2007/10/18 22:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!