glutで作ったソフトをwin10で実行した際に異常終了する問題を解決したい

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

glutで作ったソフトをwin10で実行した際に異常終了する問題を解決したい

#1

投稿記事 by bonbo_ » 5年前

お世話になっております。bonboと申します。

本サイトで検索をしたところ、同様なトピックがなかったようなので質問させていただきます。

環境をwindows10に変えたことで、glutを使って作成したソフトが、終了時(Xボタンをクリックした際)に動作を停止するようになってしまったため、その問題を解決したいと考えております。

一例としてウィンドウを表示するだけのプロジェクトをアップロードしました。
http://fast-uploader.com/file/7087167437515/
passはtestです。

一応コードはこのようになっております。

コード:

#include <GL/glut.h>
int main(int argc, char **argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

	glutCreateWindow("test");
	glutMainLoop();
	return 0;
}
私の環境は
windows10(64bit)、core i5
visualstudio community 2017を使用しています。

不備がありましたら申し訳ありません。ご指摘いただければ幸いです。
以上となりますが、よろしくお願いいたします。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: glutで作ったソフトをwin10で実行した際に異常終了する問題を解決したい

#2

投稿記事 by ISLe » 5年前

こちらの環境では件のコードはウィンドウが表示されることなく終了しますが、glutDisplayFuncで描画関数をセットすると正常に動作しました。

コード:

#include <GL/glut.h>

void display(void)
{
}

int main(int argc, char **argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

	glutCreateWindow("test");
	glutDisplayFunc(display);
	glutMainLoop();
	return 0;
}

bonbo_

Re: glutで作ったソフトをwin10で実行した際に異常終了する問題を解決したい

#3

投稿記事 by bonbo_ » 5年前

ISLeさん
ありがとうございます。

以前別の方にもwindows10の環境で確認頂いた際にも問題なく動作したため、動かないのはこちらの環境が原因なのかもしれません。
ただ、個人的にglut関連のファイル(glut32.libとglut.h)をいじってたりしてはいないので、環境の違いは生じないように思います。

また同じウィンドウを表示するプログラムでも
glutMainLoop();を使わずWINDOWS APIで表示した結果、同様に終了時に動作停止が起こりました。
そちらのプロジェクトも一応アップロードします
http://fast-uploader.com/file/7087213002735/

おそらく根本的な解決にはなっていないとは思うのですが、こちらのプログラムはwglDeleteContext(glRC);を無くすことで動作停止が起こらなくなりました。

コード:

#pragma comment(lib, "OpenGL32.lib")
#include <windows.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <gl\GL.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
const wchar_t *gName = L"OpenGLテスト";
// ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT mes, WPARAM wParam, LPARAM lParam){
	if (mes == WM_DESTROY || mes == WM_CLOSE) { PostQuitMessage(0); return 0; }
	return DefWindowProc(hWnd, mes, wParam, lParam);
}

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
	// アプリケーションの初期化
	MSG msg; HWND hWnd;
	WNDCLASSEX wcex = { sizeof(WNDCLASSEX), CS_OWNDC | CS_HREDRAW | CS_VREDRAW, WndProc, 0, 0, hInstance, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, (TCHAR*)gName, NULL };
	if (!RegisterClassEx(&wcex))
		return 0;
	RECT R = { 0, 0, 640, 480 };
	AdjustWindowRect(&R, WS_OVERLAPPEDWINDOW, FALSE);
	if (!(hWnd = CreateWindow(gName, TEXT("test2"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, R.right - R.left, R.bottom - R.top, NULL, NULL, hInstance, NULL)))
		return 0;

	// OpenGL初期化
	// ピクセルフォーマット初期化
	PIXELFORMATDESCRIPTOR pfd =
	{
		sizeof(PIXELFORMATDESCRIPTOR),
		1,
		PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, //Flags
		PFD_TYPE_RGBA, //The kind of framebuffer. RGBA or palette.
		32, //Colordepth of the framebuffer.
		0, 0, 0, 0, 0, 0,
		0,
		0,
		0,
		0, 0, 0, 0,
		24, //Number of bits for the depthbuffer
		8, //Number of bits for the stencilbuffer
		0, //Number of Aux buffers in the framebuffer.
		PFD_MAIN_PLANE,
		0,
		0, 0, 0
	};

	HDC dc = GetDC(hWnd);
	int format = ChoosePixelFormat(dc, &pfd);
	if (format == 0)
		return 0; // 該当するピクセルフォーマットが無い

	// OpenGLが使うデバイスコンテキストに指定のピクセルフォーマットをセット
	if (!SetPixelFormat(dc, format, &pfd))
		return 0; // DCへフォーマットを設定するのに失敗

	// OpenGL contextを作成
	HGLRC glRC = wglCreateContext(dc);

	// 作成されたコンテキストがカレント(現在使用中のコンテキスト)か?
	if (!wglMakeCurrent(dc, glRC))
		return 0; // 何か正しくないみたい…


	ShowWindow(hWnd, nCmdShow);
	// メッセージ ループ
	do{
		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		else {

		}
	} while (msg.message != WM_QUIT);

	// 後処理
	// カレントコンテキストを無効にする
	wglMakeCurrent(NULL, NULL);
#if 0// win10でエラーが出るため
	// カレントコンテキストを削除
	wglDeleteContext(glRC);
#endif
	// デバイスコンテキスト解放
	ReleaseDC(hWnd, dc);

	return 0;
}

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: glutで作ったソフトをwin10で実行した際に異常終了する問題を解決したい

#4

投稿記事 by ISLe » 5年前

bonbo_ さんが書きました:
5年前
ただ、個人的にglut関連のファイル(glut32.libとglut.h)をいじってたりしてはいないので、環境の違いは生じないように思います。
glutは、Visual Studio(あるいはWindows SDK)に含まれないので、そもそも環境に依存するものだと思います。
開発環境を更新したのに、(追加の)ライブラリを更新していないのであれば、不具合の原因はライブラリの互換性にあるのではないでしょうか。


#3に投稿されたコードにはglut関数が使用されていません。
OpenGL(gl)、glu、glut、wglの区別はできていますか。

こちらの環境では、wglDeleteContextを有効にしても異常は発生しませんでした。

wglDeleteContextでアプリケーションエラー等が発生するのであれば、wglCreateContextが失敗して、ヌルハンドルが返ってきているものと考えられます。

グラフィックドライバが、ライブラリが要求するOpenGLのバージョンをサポートしていないといったこともあります。
Windows SDKも含め、使っているライブラリが環境に合ったものかどうか確認してみてください。

bonbo_

Re: glutで作ったソフトをwin10で実行した際に異常終了する問題を解決したい

#5

投稿記事 by bonbo_ » 5年前

ISLeさん
ありがとうございます。
正直OpenGLとglutの違いは画像の表示ができるか否かくらいしか認識していませんでした。
検索の結果
gluはglのutilityな関数が含まれたもの、
glutとwglはwindowsでOpenGLを扱うため(ウィンドウに描画したりする)に作られたツール
だと認識しました。

>グラフィックドライバが、ライブラリが要求するOpenGLのバージョンをサポートしていないといったこともあります。
>Windows SDKも含め、使っているライブラリが環境に合ったものかどうか確認してみてください。
中古のパソコンをそのまま使っていたので、もしかしたらと思いwindowsの更新を行ったところ、エラーは出なくなりました。
確かな原因は定かではないのですが、ひとまず解決しました。
お騒がせしました。

bonbo_

Re: glutで作ったソフトをwin10で実行した際に異常終了する問題を解決したい

#6

投稿記事 by bonbo_ » 5年前

※訂正
glutはwindowsに限らず、その環境でウィンドウを表示したり描画したりを補助するツールだと認識しました。

返信

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