スクリーンセーバーが作れません。リンク時エラー

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

スクリーンセーバーが作れません。リンク時エラー

#1

投稿記事 by parapara » 13年前

ビルドするとエラーが出ます。自分でググりましたが、解決できませんでした。
構成プロパティ→リンカ→入力→追加の依存ファイル→kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;scrnsave.lib;comctl32.lib;scrnsave.lib;comctl32.lib;%(AdditionalDependencies)
では駄目なのでしょうか?;scrnsave.lib;comctl32.lib;%(AdditionalDependencies)を追加したのですが。
ご回答よろしくお願いいたします。
windows7、64bit
開発環境VisualStudio2010proです。

コード:

// 初めてのスクリーンセーバーProject.cpp : アプリケーションのエントリ ポイントを定義します。
//

#pragma once

// Windows ヘッダーから使用されていない部分を除外します。
// Windows ヘッダー ファイル:
#include <windows.h>

// C ランタイム ヘッダー ファイル
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include "resource1.h"
#include<scrnsave.h>
#define ID_MYTIMER 100
// グローバル変数:
// 現在のインターフェイス


// このコード モジュールに含まれる関数の宣言を転送します:




//
//  関数: MyRegisterClass()
//
//  目的: ウィンドウ クラスを登録します。
//
//  コメント:
//
//    この関数および使い方は、'RegisterClassEx' 関数が追加された
//    Windows 95 より前の Win32 システムと互換させる場合にのみ必要です。
//    アプリケーションが、関連付けられた
//    正しい形式の小さいアイコンを取得できるようにするには、
//    この関数を呼び出してください。
//


//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:  メイン ウィンドウのメッセージを処理します。
//
//  WM_COMMAND	- アプリケーション メニューの処理
//  WM_PAINT	- メイン ウィンドウの描画
//  WM_DESTROY	- 中止メッセージを表示して戻る
//
//
LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int x,y,xw,yh;
	HDC hdc;
	BITMAP bmp_info;
	static RECT rc;
	static char *lpszTitle="猫でも分かるwindowsプログラミング";
	static HBITMAP hMyBmp;
	static HDC hdc_mem;
	static int n;
	switch (message)
	{
	case WM_CREATE:
		SetTimer(hWnd,ID_MYTIMER,500,NULL);
		GetClientRect(hWnd,&rc);
		break;
	case WM_TIMER:
		if(wParam!=ID_MYTIMER)break;

		hdc=GetDC(hWnd);
		hMyBmp=LoadBitmap(hMainInstance,"MYBMP");
		hdc_mem=CreateCompatibleDC(hdc);
		SelectObject(hdc,hMyBmp);
		GetObject(hMyBmp,sizeof(BITMAP),&bmp_info);
		DeleteObject(hMyBmp);//残っているのはhdc_memだけ
		BitBlt(hdc,x=rand()%rc.right-36,y=rand()%rc.bottom,xw=bmp_info.bmWidth,yh=bmp_info.bmHeight
			,hdc_mem,0,0,SRCCOPY);
		SetBkMode(hdc,TRANSPARENT);
		SetTextColor(hdc,RGB(rand()%256,rand()%256,rand()%256));
		TextOut(hdc,x+xw,y+yh-12,lpszTitle,strlen(lpszTitle));
		n++;
		if(n>20){
			n=0;
			PatBlt(hdc,0,0,rc.right,rc.bottom,BLACKNESS);
		}
		DeleteDC(hdc_mem);
		ReleaseDC(hWnd,hdc);
		break;
	case WM_DESTROY:
		KillTimer(hWnd,ID_MYTIMER);
		PostQuitMessage(0);
		break;
	default:
		break;
	}
	return DefScreenSaverProc(hWnd, message, wParam, lParam);
}
BOOL WINAPI	ScreenSaverConfigureDialog(HWND hWnd, UINT message, WPARAM wp, LPARAM lp)
{
	return TRUE;
}
BOOL WINAPI	RegisterDialogClasses(HINSTANCE hInstance)
{
	return TRUE;
}

parapara

Re: スクリーンセーバーが作れません。リンク時エラー

#2

投稿記事 by parapara » 13年前

肝心のエラーを書き忘れてました。すいません。よろしくお願いします。

1>scrnsave.lib(scrnsave.obj) : error LNK2019: 未解決の外部シンボル _RegisterDialogClasses@4 が関数 _DoConfigBox@4 で参照されました。
1>C:\Users\tsukasa\documents\visual studio 2010\Projects\初めてのスクリーンセーバーSolution\Debug\初めてのスクリーンセーバーProject.exe : fatal error LNK1120: 外部参照 1 が未解決です。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: スクリーンセーバーが作れません。リンク時エラー

#3

投稿記事 by softya(ソフト屋) » 13年前

RegisterDialogClassesの引数の型が違います。
そのためC++のオーバーロード関数と判定されて違う関数として扱われたものと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

parapara

Re: スクリーンセーバーが作れません。リンク時エラー

#4

投稿記事 by parapara » 13年前

HANDLE型とHINSTANCE型で互換性があるような気がしたんですが、違う型と認識されるんですね。勉強になりました。
直したら、ビルド通りました。
ありがとうございました。感謝。迅速で助かりました。

閉鎖

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