トップページ > 記事閲覧
DxLib_Initが失敗した理由
名前:にこよん 日時: 2017/03/29 23:31

DxLib_Initで-1が返ってきたときにその理由がわかる関数はありますでしょうか? もしなくて、可能であれば追加していただけないでしょうか。 以下の Get_DxLib_Init の様につかえる関数です。 if (DxLib_Init() == -1) { // DXライブラリ初期化処理 switch (Get_DxLib_Init()) { case 0: MessageBox(NULL, TEXT("2つ同時に起動することはできません"), TEXT("error"), MB_OK); break; case 1: MessageBox(NULL, TEXT("DXライブラリが使用されている他のソフトを閉じてください"), TEXT("error"), MB_OK); break; case 2: break; case 3: break; default: //原因不明 } return -1;// エラーが起きたら終了 } 追記: タイトルとは関係ないのですが、ウィンドウの座標を取得したり ウィンドウの座標を指定した場所に移動することは可能でしょうか?
メンテ

Page: 1 |

Re: DxLib_Initが失敗した理由 ( No.1 )
名前:ゆのみ 日時:2017/03/31 19:22

追記について Dxlibの範囲ではありませんが可能です。 それぞれ、GetWindowRectとSetWindowPosで可能かと思います。 https://msdn.microsoft.com/ja-jp/library/cc364769.aspx BOOL GetWindowRect( HWND hWnd, // ウィンドウのハンドル LPRECT lpRect // ウィンドウの座標値 ); https://msdn.microsoft.com/ja-jp/library/cc411206.aspx BOOL SetWindowPos( HWND hWnd, // ウィンドウのハンドル HWND hWndInsertAfter, // 配置順序のハンドル int X, // 横方向の位置 int Y, // 縦方向の位置 int cx, // 幅 int cy, // 高さ UINT uFlags // ウィンドウ位置のオプション );
メンテ
Re: DxLib_Initが失敗した理由 ( No.2 )
名前:774 日時:2017/03/31 20:55

DxLibの隠し関数があります。 int SetWindowPosition(int x, int y); int GetWindowPosition(int *x, int *y);
メンテ
Re: DxLib_Initが失敗した理由 ( No.3 )
名前:にこよん 日時:2017/04/01 10:57

無事、ウィンドウの座標設定ができました。 774さんのやり方のほうが簡単だったのでそちらのほうでやりました。 ゆのみさん、774さんありがとうございました。
メンテ
Re: DxLib_Initが失敗した理由 ( No.4 )
名前:管理人 日時:2017/04/02 14:38

> DxLib_Initで-1が返ってきたときにその理由がわかる関数はありますでしょうか? いえ、そのような関数はありません、現在はエラー終了後に Log.txt でどのようなエラーが発生したか 確認していただくことしかできません > もしなくて、可能であれば追加していただけないでしょうか。 DxLib_Init が失敗する理由は多岐に渡るので、Get_DxLib_Init の戻り値という形を取ると メッセージの種類が何十個にもなってしまいますが大丈夫でしょうか? ( Direct3D 11 の初期化だけでも、『d3d11.dll の読み込みに失敗した』『dxgi.dll の読み込みに失敗した』 『API CreateDXGIFactory1のアドレス取得に失敗した』『IDXGIFactory1 の作成に失敗した』 『API D3D11CreateDevice のアドレス取得に失敗した』などなど、細かいエラー理由が沢山あります… )
メンテ
Re: DxLib_Initが失敗した理由 ( No.5 )
名前:にこよん 日時:2017/04/02 18:46

>DxLib_Init が失敗する理由は多岐に渡るので、Get_DxLib_Init の戻り値という形を取ると >メッセージの種類が何十個にもなってしまいますが大丈夫でしょうか? 大丈夫です。 私はプログラミング歴が浅くこのような形しか思いつきませんでしたが、もっとよさそうな方法があるなら取得方法はどのような形でも構いません。 ただ、文字列などではなく数字で取得でるなどできるだけアレンジがきく方がいいです。 目的は、配布用に分かりやすいエラーメッセージを表示したいのと、(表示する必要がなさそうなものはそのまま終了する予定) たまに謎に終了する時の原因が知りたいです。(Initのerrorじゃないかもですが) 量の多さについては全てのソフトでインクルードできる用のライブラリ的なソースを作っているので、そこに1度書けば後はずっと使えるので、 むしろ沢山あったほうがいいです。 それと、たくさんあるとのことですが、もしよければそれぞれの返り値の理由とは別に、 簡単にまとめれるものだけ、下の様なメッセージの表示できる程度の簡単な対処法などを教えてください。 返り値が1〜7までの場合 [最新のdirectXを入れる] みたいな... 表示する時に error message d3d11.dll の読み込みに失敗した directXのバージョンが古い可能性があります [OK] の様にヒント的な表示をしたいと思っています。
メンテ
Re: DxLib_Initが失敗した理由 ( No.6 )
名前:管理人 日時:2017/04/05 23:24

ご返信が遅くなり申し訳ありません Get_DxLib_Init という名前ではありませんが、ご提案の機能を実装したバージョンをアップしましたので、 よろしければこちらをダウンロードしてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.exe // Windows版 C++ Builder 10.1 Berlin 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』をして下さい) 以下の関数を追加しました // 最後に発生したエラーのエラーコードを取得する // // 戻り値 //  0:エラーが発生していない、又はエラーコード出力に対応したエラーが発生していない //  0以外:エラーコード int GetLastErrorCode( void ) ; // エラーコード一覧 #define DX_ERRORCODE_WIN_DESKTOP_24BIT_COLOR (0x01010001) // デスクトップが24ビットカラーモードだった #define DX_ERRORCODE_WIN_DOUBLE_START (0x01010002) // 二重起動 #define DX_ERRORCODE_WIN_FAILED_CREATEWINDOW (0x01010003) // ウインドウの作成に失敗 #define DX_ERRORCODE_WIN_FAILED_ASYNCLOAD_CREATE_THREAD (0x01010004) // 非同期読み込み処理を行うスレッドの立ち上げに失敗 #define DX_ERRORCODE_WIN_FAILED_CREATE_DIRECTDRAW7 (0x01020001) // DirectDraw7 の取得に失敗 #define DX_ERRORCODE_WIN_FAILED_INITIALIZE_DIRECTDRAW7 (0x01020002) // DirectDraw7 の初期化に失敗 #define DX_ERRORCODE_WIN_NOT_COMPATIBLE_SCREEN_COLOR_MODE (0x01020003) // 非対応の画面カラーモードが指定された #define DX_ERRORCODE_WIN_FAILED_CHANGE_DISPLAY_SETTINGS (0x01020004) // Win32API の ChangeDisplaySettings を使用した画面モードの変更に失敗 DxLib_Init の戻り値が失敗を示す -1 だった場合に、GetLastErrorCode でエラーになった原因を 取得することができます そして、自分でも意外だったのですが DxLib_Init が -1 を返す原因は上記の 8つだけでした というのも、グラフィック関連では DirectX 11 や DirectX 9 の初期化に失敗した場合はソフトウエアレンダリングモードに なるため最低限必要な DirectDraw7 関連の失敗のみ DxLib_Init が -1 を返す原因となり、サウンドや入力関連のエラーが 発生しても( 例えば DirectSound や DirectInput の初期化エラーが発生しても )その場合は DirectSound や DirectInput を使用しないで動作するようになるだけで、DxLib_Init は -1 を返さないという設計になっていました ( 自分でも忘れていました… ) > それと、たくさんあるとのことですが、もしよければそれぞれの返り値の理由とは別に、 > 簡単にまとめれるものだけ、下の様なメッセージの表示できる程度の簡単な対処法などを教えてください。 DxLib_Init が -1 を返す原因となるエラー 8つのそれぞれの対処法は以下の通りです #define DX_ERRORCODE_WIN_DESKTOP_24BIT_COLOR (0x01010001) // デスクトップが24ビットカラーモードだった デスクトップ画面のカラービット数を 24bit 以外にする #define DX_ERRORCODE_WIN_DOUBLE_START (0x01010002) // 二重起動 ソフトを二重起動しない #define DX_ERRORCODE_WIN_FAILED_CREATEWINDOW (0x01010003) // ウインドウの作成に失敗 対処法は不明( ごく普通のPCであればこのエラーは発生しないので ) #define DX_ERRORCODE_WIN_FAILED_ASYNCLOAD_CREATE_THREAD (0x01010004) // 非同期読み込み処理を行うスレッドの立ち上げに失敗 対処法は不明( ごく普通のPCであればこのエラーは発生しないので ) #define DX_ERRORCODE_WIN_FAILED_CREATE_DIRECTDRAW7 (0x01020001) // DirectDraw7 の取得に失敗 対処法は不明( ごく普通のPCであればこのエラーは発生しないので ) #define DX_ERRORCODE_WIN_FAILED_INITIALIZE_DIRECTDRAW7 (0x01020002) // DirectDraw7 の初期化に失敗 対処法は不明( ごく普通のPCであればこのエラーは発生しないので ) #define DX_ERRORCODE_WIN_NOT_COMPATIBLE_SCREEN_COLOR_MODE (0x01020003) // 非対応の画面カラーモードが指定された DXライブラリが対応している画面カラーモード( 16, 32 )以外を関数 SetGraphMode で指定しない #define DX_ERRORCODE_WIN_FAILED_CHANGE_DISPLAY_SETTINGS (0x01020004) // Win32API の ChangeDisplaySettings を使用した画面モードの変更に失敗 対処法は不明( ごく普通のPCであればこのエラーは発生しないので ) 『対処法は不明』となっているのは、普通のPCであれば発生する筈のないエラーなので、仮にエラーが発生しても 何が原因で発生したのか予想できないからです デスクトップのカラービット数を 24bit にできる環境も今ではほぼ無くなっているので、 実際にメッセージを出す機会があるエラーはにこよんさんがスレッドの最初で示された 二重起動だけになると思います
メンテ
Re: DxLib_Initが失敗した理由 ( No.7 )
名前:にこよん(多分解決) 日時:2017/04/08 17:50

ありがとうございましたm(__)m 今、ビジュアルスタジオが1次的に使えないのでかくにんできてませんが、来週ぐらいに使ってみます。 2重起動以外確認できそうではありませんが(-_-;)
メンテ
Re: DxLib_Initが失敗した理由 ( No.8 )
名前:にこよん 日時:2017/04/15 21:05

確認が遅くなってしまってすみませんでした。 無事に関数を使うことができました。ありがとうございましたm(__)m 一応ソースコードも載せておきます。 他にこの関数を使う方がいたら参考までに使ってください。(間違っていたら教えてください) //DXライブラリの初期化に失敗した時にエラーメッセージを表示する void dx_error_message() { switch (GetLastErrorCode()) { case DX_ERRORCODE_WIN_DESKTOP_24BIT_COLOR: MessageBox(NULL, TEXT("24bitカラーモードで起動することはできません\nデスクトップ画面のカラービット数を24bit 以外にしてください"), TEXT("エラーメッセージ"), MB_OK); break; case DX_ERRORCODE_WIN_DOUBLE_START: MessageBox(NULL, TEXT("同時に起動することはできません\n"), TEXT("エラーメッセージ"), MB_OK); break; case DX_ERRORCODE_WIN_FAILED_CREATEWINDOW: MessageBox(NULL, TEXT("ウインドウの作成に失敗しました"), TEXT("エラーメッセージ"), MB_OK); break; case DX_ERRORCODE_WIN_FAILED_ASYNCLOAD_CREATE_THREAD: MessageBox(NULL, TEXT("非同期読み込み処理を行うスレッドの立ち上げに失敗しました"), TEXT("エラーメッセージ"), MB_OK); break; case DX_ERRORCODE_WIN_FAILED_CREATE_DIRECTDRAW7: MessageBox(NULL, TEXT("DirectDraw7 の取得に失敗しました"), TEXT("エラーメッセージ"), MB_OK); break; case DX_ERRORCODE_WIN_FAILED_INITIALIZE_DIRECTDRAW7: MessageBox(NULL, TEXT("DirectDraw7 の初期化に失敗しました"), TEXT("エラーメッセージ"), MB_OK); break; case DX_ERRORCODE_WIN_NOT_COMPATIBLE_SCREEN_COLOR_MODE: MessageBox(NULL, TEXT("非対応の画面カラーモードが指定されました\nソフト本体に問題があると思われます\nこの症状をにこよんに報告してください"), TEXT("エラーメッセージ"), MB_OK); break; case DX_ERRORCODE_WIN_FAILED_CHANGE_DISPLAY_SETTINGS: MessageBox(NULL, TEXT("Win32API の ChangeDisplaySettings を使用した画面モードの変更に失敗しました"), TEXT("エラーメッセージ"), MB_OK); break; default: MessageBox(NULL, TEXT("原因不明のエラーが発生しました"), TEXT("エラーメッセージ"), MB_OK); break; } } void main(){ if (DxLib_Init() == -1) { // DXライブラリ初期化処理 dx_error_message(); //エラーメッセージ表示 return -1; // エラーが起きたら直ちに終了 } } それと特に問題があるわけではないのですが #define DX_ERRORCODE_WIN_NOT_COMPATIBLE_SCREEN_COLOR_MODE (0x01020003) // 非対応の画面カラーモードが指定された ↑が返ってくることはあるのでしょうか? 試しに SetGraphMode(SCREEN_X, SCREEN_Y, 32); で32の部分に22やら-100やらいろいろ入れてみましたが 画面が小さく(多分初期のサイズ)なるだけで問題なく起動しました。 SetGraphMode関数で、対応している値以外が渡されたら自動的に初期値に設定されるようになっているのではないでしょうか?
メンテ
Re: DxLib_Initが失敗した理由 ( No.9 )
名前:管理人 日時:2017/04/16 19:04

> それと特に問題があるわけではないのですが > #define DX_ERRORCODE_WIN_NOT_COMPATIBLE_SCREEN_COLOR_MODE (0x01020003) // 非対応の画面カラーモードが指定された > ↑が返ってくることはあるのでしょうか? > 試しに SetGraphMode(SCREEN_X, SCREEN_Y, 32); で32の部分に22やら-100やらいろいろ入れてみましたが > 画面が小さく(多分初期のサイズ)なるだけで問題なく起動しました。 > SetGraphMode関数で、対応している値以外が渡されたら自動的に初期値に設定されるようになっているのではないでしょうか? 確かに、仰る通りです 内部では使用しているので削除はしないでおこうと思いますが、実際に戻ってくることはありません… (・・;;
メンテ
Re: DxLib_Initが失敗した理由 ( No.10 )
名前:にこよん (解決) 日時:2018/03/20 14:16

内部で使用してたのですか。 わざわざ関数を追加していただきありがとうございました。 今後ともよろしくお願いしますm(__)m
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存