質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1609閲覧

C++ CreateWindowでNULLが返る

nanashi123

総合スコア51

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2023/01/17 23:10

編集2023/01/17 23:23

CreateWindowという関数を用いてウィンドウを作成するコードを書きました

C++

1#include <windows.h> 2 3void Window(int x, int y, int z, int w) 4{ 5 HINSTANCE *h = new HINSTANCE(); 6 HINSTANCE hInstance = *h; 7 HWND win = CreateWindow(TEXT("STATIC"), TEXT("Sample"), WS_ACTIVECAPTION, x, y, z, w, 8 NULL, NULL, hInstance, NULL); 9 10 if (win == NULL) 11 { 12 return; 13 } 14 15 ShowWindow(win, SW_SHOW); 16 MessageBox(NULL, TEXT("Succes"), TEXT("Result"), MB_ICONINFORMATION); 17} 18 19int main() 20{ 21 Window(500, 500, 500, 500); 22 return 0; 23}

このコードを3つのcppファイルにコピーして、TEXT内の文字列のみを変更しています

まず1つ目をMINGWの32ビット版でg++コマンドによりコンパイルしたところ、生成されたexeファイルは正常にWindowを表示しました
2つ目はVidualStudioにてビルド及びコンパイルを行い、こちらも正常にWindowの表示を完了しました
しかし3つ目のcppファイルでは上記のいずれの手段でもWindowの生成に失敗してしまいます

生成できるWindowが二つまでなのかと考え、一つ目のcppファイルを完全に削除した後に再度コンパイルを行っても結果は変わらず、Windowは表示されません

この3つ目のファイル内ではCreateWindowからNULLが返されているらしく、エラーメッセージも生成されないため原因が特定できません
GetLastErrorという関数を用いて内部のエラーコメントを取得できるという情報も確認し、その取得を試みたものの、こちらもメソッドが動作しないのかエラーを返しません

一方MessageBox関数は正常に動作し、if文内のreturn前にこの関数を宣言した場合には、Windowが生成されない場合でもメッセージを表示してくれます

現在は新規に作成したファイルでこのコードを記述しても、ウィンドウを表示しない状況です
どのような原因が考えられるでしょうか?
また、GetLastError関数の使用以外で、この内部的におそらく発生しているであろうエラーを特定する方法は存在するでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2023/01/17 23:26

> HINSTANCE *h = new HINSTANCE(); > HINSTANCE hInstance = *h; 普通はこういうことをしません。HINSTANCEとして無意味で、場合により悪影響があるはずです。どこかから参考にされたのでしょうか。また、3つ目のCPPと言うのが分かりませんが、ビルドした環境が違うということですか?
nanashi123

2023/01/18 01:41

3つ目のファイルを含め、新規ファイルは全て質問中に挙げた二つの手段(g++コマンド(MINGW32)を使用した方法とVidualStudioを用いたビルド)でコンパイルを行っています VidualStudioは2022を最新のバージョンで使用しています また、プロジェクトはコンソールアプリです コードはサイト上のサンプルから転用したものです そのため、正式な記法は認知しておらず、ポインタを用いたオブジェクトの生成例程度の認識です もし可能であれば、悪影響のあるケースを一例挙げて頂けると幸いです あるいは質問の通り、考えられる要因若しくはエラーの取得手段をご教示頂けるとありがたく思います
int32_t

2023/01/18 02:29

コンソールアプリなら、 HINSTANCE hInstance = GetModuleHandle(NULL); のようにする必要がありますね。 > コードはサイト上のサンプルから転用したものです どのサイトでしょうか。
int32_t

2023/01/18 02:49

> TEXT内の文字列のみを変更しています どこをどのように変えましたか。
int32_t

2023/01/18 03:04

あと GetLastError() は使えるはずなので、GetLastError() に関してどういうコードを書いたのか開示してください。
nanashi123

2023/01/18 04:32

申し訳ありません コードの転用元についてはどのサイトからだったかが記憶になく、またコードを検索欄に貼り付けての検索では類似のサイトがヒットするのみで引用元が発見できそうにありません TEXTについては文字列のみを変更しています 質問に記述のある通り、コードそのものはコピーペーストしており、”Sample"を”Text"などと書き換えるのみの編集に留めています GetLastErrorを使用したコードは以下の通りです ```C++ #include <windows.h> void Window(int x, int y, int z, int w) { HINSTANCE *h = new HINSTANCE(); HINSTANCE hInstance = *h; HWND win = CreateWindow(TEXT("STA"), TEXT("Sam"), WS_ACTIVECAPTION, x, y, z, w, NULL, NULL, hInstance, NULL); if (win == NULL) {       GetLastError(); return; } ShowWindow(win, SW_SHOW); MessageBox(NULL, TEXT("Succes"), TEXT("Result"), MB_ICONINFORMATION); } int main() { Window(500, 500, 500, 500); return 0; } ``` if文内でreturn前に宣言することでエラーの取得を試みましたが、コンソール画面には何も表示されていない状態です また、GetModuleHandle(NULL)をhinstanceに代入するパターンもテストしましたが、こちらは正常に動作をしているのかが判別できません コンソール画面自体は表示されます ```C++ void Window(int x, int y, int z, int w) { HINSTANCE hInstance = GetModuleHandle(NULL); HWND win = CreateWindow(TEXT("STA"), TEXT("Sam"), WS_CAPTION, x, y, z, w, NULL, NULL, hInstance, NULL); if (win == NULL) { return; } ShowWindow(win, SW_SHOW); MessageBox(NULL, TEXT("Succes"), TEXT("Result"), MB_ICONINFORMATION); } int main() { Window(500, 500, 500, 500); } ```
nanashi123

2023/01/18 04:54

申し訳ありません 引数にWS_ACTIVECAPTIONが指定されていますが、ここはWS_CAPTIONからの変更を一度試した時の編集部分です WS_CAPTIONでウィンドウが生成できなかったファイルを使用しています
guest

回答2

0

ベストアンサー

HWND win = CreateWindow(TEXT("STA"), TEXT("Sam"), WS_ACTIVECAPTION, x, y, z, w, ...

第一引数の TEXT("STATIC") は変更してはいけません。ここは登録済みのクラス名しか受け付けません。

GetLastError();

GetLastError() の戻り値を捨てては意味がありません。戻り値を表示して手動で意味を調べるとか、FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, ...) でエラーメッセージを取得するなどして使いましょう。

投稿2023/01/18 04:53

編集2023/01/18 04:58
int32_t

総合スコア20882

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

回答ありがとうございます
なるほど、CreateWindow("Class","TiTle"..)となっていたのですね
クラス名に限定されることを知らず原因を半ば別にあると決めつけてしまっていた姿勢が原因のようです

文字列を変更したコードも事前に掲載すべきでした
お手間を煩わせて申し訳ありません
貴重なお時間を割いて頂き誠にありがとうございました

無事Windowの生成に成功しました

投稿2023/01/18 05:18

nanashi123

総合スコア51

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問