エラー1814の XP と Win2000の違いについて

解決


田舎のおやじ  2005-08-27 21:17:36  No: 58779

VC++6.0 SDKでの開発スタイルです。
WinMain の中に DialogBox関数を記述しダイヤログを表示させようとしています。

int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode)
{

  DialogBox(hThisInst, MAKEINTRESOURCE(IDD_FORMVIEW), HWND_DESKTOP, (DLGPROC)DlgProc);
  
  return 0;
}

LRESULT CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wP, LPARAM lP)
{
  static HWND hWndConnect, hWndAccept;
...

XPではうまく表示されるのですが Win2000ですとダイヤログが表示されません、デバッグで追ってゆくとステップインでも DialogBox関数の中に入らず次の行に行って終了してしまいます。
GetLastError で値をとると 1814 で,調べますと「指定されたリソース名は、イメージ ファイルに見つかりません。」
という事なのですが、同じプロジェクトでもXPでは動作します。

なぜこのような違いが生じるのかどのような対策が必要なのかご存じの方おられませんか?

Win2000は Pro. SP4  IE6 と言う環境です。
XP は Pro. SP2 IE6 です。

よろしくお願いします


isshi  2005-08-28 03:02:19  No: 58780

質問が曖昧です。
同じプロジェクトを Win2000 でコンパイルした場合と、XP でコンパイルした
場合で違いが生じるということでしょうか?
それとも同じ EXE を Win2000 と XP で実行したときに違いが生じるのでしょうか?
いずれにしてもそのような現象を私は見たことがありません。

とりあえず、リソースを作り直してみては?


田舎のおやじ  2005-08-28 07:24:42  No: 58781

isshiさん
コメントありがとうございます

>同じプロジェクトを Win2000 でコンパイルした場合と、XP でコンパイルした
>場合で違いが生じるということでしょうか?
>それとも同じ EXE を Win2000 と XP で実行したときに違いが生じるのでしょうか?
>いずれにしてもそのような現象を私は見たことがありません。
>
>とりあえず、リソースを作り直してみては?

同じプロジェクトを Win2000上でコンパイルしても XP上でコンパイルしても
生成された実行ファイルは  XP → ○   Win2000 → × です。

Win2000でだめな場合、NT4.0 でも 98SEでもだめです。
子供が使っている XP homeでは何事もなく動作します。

結局、リソースを作り直しても変わりませんでした。
デバッグで コールバックプロシージャへの入り方がわかったのですが
Win2000の場合は、最初に流れてくるはずの WM_INITDIALOG: もこないようで
最後の return 文を何回か通過した後に終わってしまっています。


isshi  2005-08-28 10:06:38  No: 58782

コモンコントロールを使っているのに、InitCommonControls を呼んでないとか、
リッチエディットコントロールを使っているのに、riched20.dll を  LoadLibraryしてない場合、
ダイアログの起動に失敗します。
ただ、今回は XP では表示されるので、これが原因ではないと思いますが。

OK,キャンセルボタンのみの最小限のダイアログボックスでも同じ現象が
発生しますか?
それで問題なければ徐々にコントロールを追加していって、どの段階で
だめなのかが特定できると思います。


田舎のおやじ  2005-08-28 16:28:10  No: 58783

ありがとうございます
>コモンコントロールを使っているのに、InitCommonControls を呼んでないとか、
>リッチエディットコントロールを使っているのに、riched20.dll を  LoadLibraryしてない場合、
>ダイアログの起動に失敗します。
>ただ、今回は XP では表示されるので、これが原因ではないと思いますが。

使っているコントロールは標準のエディットボックス ボタン チェックボックスの
みです。コード的には普段使わない ws2_32.lib を使っているぐらいです。

しかし、ws2_32.lib を使うコードを削除してもだめです。
あ、逆に追加していってどこでだめになるかをみればいいですね・・・

それにしても、起動時にコールバックプロシージャが何回か呼び出されているに
もかかわらず WM_INITDIALOGメッセージがこない事がヒントだと思うのですが
なぜ XPで来て、Win2000でこないのか・・・ 悩みます。


RAPT  2005-08-29 08:22:22  No: 58784

isshi さんが既に指摘されている
> OK,キャンセルボタンのみの最小限のダイアログボックスでも同じ現象が
> 発生しますか?
は試してみたのでしょうか。

> ws2_32.lib を使うコードを削除してもだめです。
ちなみに、そのインポートライブラリとwinsock2.hも除外していますか?

まずは、最小限のコードで動作確認をし、徐々に追加していって
原因範囲を狭めていくのが一般的な手法です。

上記手順で何が原因か逐一検証してみてください。

それから、VC++6.0は最新のサービスパックsp6は当ててありますか?

> デバッグで追ってゆくとステップインでも DialogBox関数の中に入らず
> 次の行に行って終了してしまいます。
DialogBoxは関数ではなく、マクロです。そのため、ステップインはできません。
# 関数じゃないから、::DialogBox(...)とかDialogBox (...)とかすると
# コンパイルエラーになるはず。

デバッグトレースするなら、ダイアログボックスプロシージャ内に
ブレークポイントを置くと良いでしょう。


田舎のおやじ  2005-08-29 19:39:29  No: 58785

RAPTさん
コメントありがとうございます。

Win2000上で0からコーディングするとXP,Win2000共に動作しました。
明確な原因を突き止めるには至っていませんが、GetLastErrorから
するとリソース(ダイヤログ)の作り方に問題があるのかも知れません

ならばなぜ XPで動くのかがわかりませんが(滝汗)、トホホな結果ですが
一応解決とさせていただきます.
ご回答くださったみなさま、ありがとうございました。
御礼申し上げます.m(__)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加