Re: DxLib_Initが失敗した理由 ( No.1 ) |
- 名前:ゆのみ 日時:2017/03/31 19:22
|
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
|