C言語でリソースの練習をしています

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
h1j1k1
記事: 37
登録日時: 6年前

C言語でリソースの練習をしています

#1

投稿記事 by h1j1k1 » 6年前

C言語でリソースを扱う練習をしているのですが、
Dllにする所はできたのですがDllからロードする方法がわかりません。

コード:

// images.rc
MY_ICON ICON DISCARDABLE ".\\image\\icon.ico"
MY_CURSOR CURSOR DISCARDABLE ".\\image\\cursor.cur" 

コード:

// main.c
#include <windows.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

#define PROGRAM_NAME "SpyLit"


HINSTANCE hInstance;
HWND hMainWindow;

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp);

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp){ 
	HDC hdc;
	PAINTSTRUCT ps;
	
	switch (msg) {
		case WM_DESTROY:{
			PostQuitMessage(0);
			break;
		}
	}
	return DefWindowProc(hwnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow ) {
	
	
	hInstance = hInst;
	WNDCLASSEX wc;
	PSTR pClassName = TEXT(PROGRAM_NAME);
	PSTR pWindowName = TEXT("MAIN");
	
	wc.cbSize = sizeof(wc);
	wc.style = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = WndProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInst;
	wc.hIcon = LoadIcon(hInstance, TEXT("MY_CURSOR"));
	wc.hIconSm = wc.hIcon;
	wc.hCursor = LoadCursor(hInstance, TEXT("MY_CURSOR"));
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName = NULL;
	wc.lpszClassName = pClassName;

	if (!RegisterClassEx(&wc)) return FALSE;
	
	hMainWindow = CreateWindow(
			wc.lpszClassName, pWindowName,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL , hInstance , NULL);
			
	if(hMainWindow == NULL) return FALSE;
	
	MSG msg;
	while(GetMessage(&msg , NULL , 0 , 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return 0;
} 

このようにしてるのですが、描画されません。
どうしたらいいでしょうか

maru
記事: 150
登録日時: 13年前

Re: C言語でリソースの練習をしています

#2

投稿記事 by maru » 6年前

DLLのリソースをロードするにはDLLのインスタンスハンドルを指定する必要があります。
DLLのインスタンスハンドルはLoadLibraryEx関数で取得します。

Bull
記事: 149
登録日時: 9年前

Re: C言語でリソースの練習をしています

#3

投稿記事 by Bull » 6年前

LoadIcon と LoadCursor をする時に、EXE のインスタンスハンドルを指定しているからでしょう。
LoadLibrary でDLL のインスタンスハンドルを取得し、それを指定すれば良いと思います。

リソースのみの DLL の作成
を参考にしてみて下さい。

naohiro19
記事: 256
登録日時: 13年前
住所: 愛知県

Re: C言語でリソースの練習をしています

#4

投稿記事 by naohiro19 » 6年前

C++の<memory> というヘッダを使ってスコープから外れると自動的に解放してくれる std::unique_ptr を使います。

コード:

#include <memory>
#include <type_traits>
#include <cassert>
#include <Windows.h>

void DllCloser(HMODULE hmodule) {
	assert(hmodule);
	FreeLibrary(hmodule);
}
std::unique_ptr<std::remove_pointer<HMODULE>::type, decltype(&DllCloser)>
		dll(LoadLibraryA("****.dll"), DllCloser);
DLLのハンドルを取得するには dll.get() と書くだけでそのDLLのハンドルを取得できます。また GetProcAddress(dll.get(), "関数名"); と渡すことでその関数ポインタのアドレスも取得ができます。
なお、DllCloser関数内で assertを書いているのは DLLのハンドルが nullでないことをあらわすためですので書いておけばOKです。

h1j1k1
記事: 37
登録日時: 6年前

Re: C言語でリソースの練習をしています

#5

投稿記事 by h1j1k1 » 6年前

maruさんBullさんnaohiro19さん素早い返信ありがとうございます

maruさん>>
dllはコンパイルに入れるだけではなく、ハンドルを取得しなければいけないのですね。
ありがとうございます!

Bullさん>>
このサイトは前も見たのですが、下のほうに使用方法も乗ってたんですね。
見落としてましたすいません

naohiro19さん>>
ソースまで載せていただきありがとうございます...といいたいところなのですが、
C言語で勉強しているので....申し訳ございません!

返信

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