スクリーンセーバーの基礎プログラム実行時のエラーについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
SKB

スクリーンセーバーの基礎プログラム実行時のエラーについて

#1

投稿記事 by SKB » 10年前

初めまして。
現在、Microsoft VisualC++ 2010 ExpressとDXライブラリを用いてスクリーンセーバーの製作を考えています。
C言語の基本的な部分はある程度理解した状態で、C++を勉強し始めているところです。
そこで、この掲示板を含む様々なサイトから知恵を拝借し、とりあえず基礎の部分を実行してみることにしました。
以下そのコードです

コード:

#include <Windows.h>
#include "scrnsave.h"
#include "DxLib.h"

//スクリーンセーバーを作るためのライブラリ
#pragma comment(lib,"scrnsave.lib")
#pragma comment(lib, "comctl32.lib")

LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CREATE:
            //起動処理
            break;
 
        case WM_DESTROY:
            //終了処理
            break;
 
        default:
            break;
    }
 
    return DefScreenSaverProc(hWnd, msg, wParam, lParam);
}
 
BOOL WINAPI ScreenSaverConfigureDialog(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
    return TRUE;
}
 
BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
{
    return TRUE;
}
これを実行したところ、デバッグ欄に以下のようなメッセージが表示されました。

'ScreenSaver.exe': 'Z:\win\Personal\Visual Studio 2010\Projects\ScreenSaver\Debug\ScreenSaver.exe' を読み込みました。シンボルが読み込まれました。
'ScreenSaver.exe': 'C:\Windows\SysWOW64\ntdll.dll' を読み込みました。Cannot find or open the PDB file
'ScreenSaver.exe': 'C:\Windows\SysWOW64\kernel32.dll' を読み込みました。Cannot find or open the PDB file
'ScreenSaver.exe': 'C:\Windows\SysWOW64\KernelBase.dll' を読み込みました。Cannot find or open the PDB file
'ScreenSaver.exe': 'C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.9600.17415_none_7c5769eaaa0aa358\comctl32.dll' を読み込みました。Cannot find or open the PDB file
'ScreenSaver.exe': 'C:\Windows\SysWOW64\user32.dll' を読み込みました。Cannot find or open the PDB file
'ScreenSaver.exe': 'C:\Windows\SysWOW64\gdi32.dll' を読み込みました。Cannot find or open the PDB file
'ScreenSaver.exe': 'C:\Windows\SysWOW64\advapi32.dll' を読み込みました。Cannot find or open the PDB file
'ScreenSaver.exe': 'C:\Windows\SysWOW64\msvcrt.dll' を読み込みました。Cannot find or open the PDB file
'ScreenSaver.exe': 'C:\Windows\SysWOW64\sechost.dll' を読み込みました。Cannot find or open the PDB file
'ScreenSaver.exe': 'C:\Windows\SysWOW64\rpcrt4.dll' を読み込みました。Cannot find or open the PDB file
'ScreenSaver.exe': 'C:\Windows\SysWOW64\sspicli.dll' を読み込みました。Cannot find or open the PDB file
'ScreenSaver.exe': 'C:\Windows\SysWOW64\cryptbase.dll' を読み込みました。Cannot find or open the PDB file
'ScreenSaver.exe': 'C:\Windows\SysWOW64\bcryptprimitives.dll' を読み込みました。Cannot find or open the PDB file
'ScreenSaver.exe': 'C:\Windows\SysWOW64\imm32.dll' を読み込みました。Cannot find or open the PDB file
'ScreenSaver.exe': 'C:\Windows\SysWOW64\msctf.dll' を読み込みました。Cannot find or open the PDB file
'ScreenSaver.exe': 'C:\Program Files (x86)\K7 Computing\K7TSecurity\k7crvr.dll' を読み込みました。Cannot find or open the PDB file
'ScreenSaver.exe': 'C:\Program Files (x86)\K7 Computing\K7TSecurity\k7crvr.dll' をアンロード
プログラム '[11732] ScreenSaver.exe: ネイティブ' はコード -1 (0xffffffff) で終了しました。

対処法を調べてみたところ、「Cannot find or open the PDB file」に関しては気にしなくていいということは分かったのですが、k7crvr.dllとやらがしっかり存在しているのに何故アンロードしてしまっているのかがさっぱりわかりません。
コード -1 で終了しているのを見ると、やはりこのk7crvr.dllが読み込めていないのが悪いのだと思うのですが、何か対策があればご教授よろしくお願いいたします。
また前述のように、プログラミングに関して理解が浅い部分が多々あると思うので、出来れば具体的に教えてもらいたいと思っています。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: スクリーンセーバーの基礎プログラム実行時のエラーについて

#2

投稿記事 by みけCAT » 10年前

ScreenSaverConfigureDialog関数が仕様を満たしていない気がするのですが、気のせいでしょうか?

ScreenSaverConfigureDialog 関数
関数がメッセージを処理する場合、TRUE を返さなければなりません。WM_INITDIALOG メッセージにのみ応答し、それ以外のメッセージを処理しない場合、FALSE を返さなければなりません。WM_INITDIALOG メッセージに応答するとき、ScreenSaverConfigureDialog 関数は SetFocus 関数を呼び出してダイアログボックス内のいずれかのコントロールにキーボードフォーカスを設定する場合、FALSE を返さなければなりません。それ以外の場合、この関数は TRUE を返さなければなりませんが、これはシステムが、ダイアログボックス内でフォーカスを受け取ることのできる最初のコントロールへキーボードフォーカスを設定することを意味します。
【追記】いや、今回のように全てのメッセージに応答しない場合の戻り値はここでは未定義なのか…

【追記2】
ScreenSaverConfigureDialog function (Windows)
If the function successfully processes the message, it should return TRUE. If not, it should return FALSE, except in response to a WM_INITDIALOG message. In response to a WM_INITDIALOG message, ScreenSaverConfigureDialog should return FALSE if it calls the SetFocus function to set the keyboard focus to one of the controls in the dialog box. Otherwise, the function should return TRUE, in which case the system sets the keyboard focus to the first control in the dialog box that can be given the focus.
ここによると、メッセージを処理していない時はFALSEを返すべきであるようなので、やはり仕様が満たされていないように見えます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

SKB

Re: スクリーンセーバーの基礎プログラム実行時のエラーについて

#3

投稿記事 by SKB » 10年前

FALSEにしてみましたが全く同じメッセージが出てきました。

ですがそれとは別の話で、色々調べてみたところ、ビルド時に生成された「ScreenSaver.exe」の拡張子をsrcにすれば良いとのことで、ScreenSaver.srcを実行してみたところ、真っ黒な画面が全画面に表示され、マウスを動かしたりキー入力すると消えるというスクリーンセーバーの性質を満たした動作が起こりました。
これは、一応正しく動作しているということなんでしょうか…。
デバッグ欄のメッセージがどういうことなのかは相変わらずさっぱり分かりませんが、これで大丈夫そうだと言うのならこのトピックは解決にさせていただきたいと思います。ご意見よろしくお願いします。

ARCS

Re: スクリーンセーバーの基礎プログラム実行時のエラーについて

#4

投稿記事 by ARCS » 10年前

Windowsのスクリーンセーバーは普通に実行すると設定画面が出るようになっています。
ですのでこのソースでは、設定画面が用意されていないためなにもおこらず終了するのが正常な動作です。

スクリーンセーバーとして起動する為には、/sオプションを付けて起動する必要があり、
Visual C++上からスクリーンセーバーとして起動するには、
プロジェクトのプロパティのデバッグ→コマンド引数に/sを設定する必要があります。

拡張子を.scrにして実行するとスクリーンセーバーとして起動するのは、
拡張子.scrだと/sオプション付きで実行されるように関連付けされているからです。

SKB

Re: スクリーンセーバーの基礎プログラム実行時のエラーについて

#5

投稿記事 by SKB » 10年前

なるほど、そういうことだったんですね。
丁寧な解説ありがとうございました。
おかげ様で安心できましたので、これにて解決とさせて頂きます。お二方とも、ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る