0

既存の 32 ビット MFC コードを 64 ビットに移行するプロセスで、ビルドに成功し、コードをテストしようとしました。

残念ながら、プロセスをテストしている間、プロセスは失敗するようです(むしろクラッシュします)

失敗したスタック

hWnd = ::CreateDialogIndirect(hInst, lpDialogTemplate,  pParentWnd->GetSafeHwnd(), AfxDlgProc);
CreateDlgIndirect(lpDialogTemplate, CWnd::FromHandle(hWndParent), hInst)
CDialog::DoModal()

ダンプが生成されず、生成された例外が SEH によってキャッチされない

デバッグ実行を既存の動作中の Win32 デバッグ実行と比較してみましたが、大きな違いは見つかりませんでした

現時点では、どのように進めればよいかわかりません。どんな種類の助けも大いに期待されています

例外情報: xyz.exe の 0x000007fefd89a5ed (KernelBase.dll) での初回例外: 0x00001234: 0x1234。

実際の問題

実際の問題は、ポインターの切り捨てが原因でクラッシュすることが原因でした。@OwenWengeredのソリューションは、問題を特定し、現在取り組んでいるそのようなすべてのポインターの切り捨てに対処するのに役立ちました。運が良かった:-)

4

2 に答える 2

0

非常によく似た問題がありました。以前は、VS6 でコーディングしていたときに、マニフェスト ファイル (リソースの下) を作成して、ダイアログの外観を変更し、WinXP ダイアログの外観 (エッジが丸くなっている) を与えることができました。

https://msdn.microsoft.com/en-us/library/aa289524%28v=vs.71%29.aspx

そのため、リソースの RT_MANIFEST の下に IDR_WIN_XP_THEME というファイルがありました。

Visual Studio のすべてのバージョンにアップグレードできました。しかし、VS2015 でアプリを 64 ビットに変換し、64 ビットでアプリケーションを開こうとすると、例外エラーで失敗しました。

0x000007FEFC94965D (KernelBase.dll) でスローされる例外

IDR_WIN_XP_THEME マニフェスト ファイルを削除したところ、機能し始めました。

于 2016-03-17T17:17:41.697 に答える
0

HansPassant がコメントで既に述べたように、それをデバッグし、その時点でアプリケーションが実際に何をしようとしたかを追跡する以外にできることはほとんどありません。

完全な開始では、「0x1234」の値は非常に奇妙に思えます。ソースがある場合は、問題のある行を見つけて、そこにブレークポイントを設定します。次に、ヒットしたら、どの値 (hinst? lpdialogtemplate? pParentWnd?) がその 0x1234 にトリミングされた可能性があるかを確認します。デバッグ セッションでは値 1234 が異なる可能性があるため、注意して、奇妙に見えるポインターを確認してください。小さすぎるか、整列していないように見えます。

情報源がある場合は、引用した部分を (前に!) 前後に投稿してください。

ソースがない場合は、入手してみてください :)

それらを取得できない場合は、生の(逆)アセンブリでデバッグできますが、asm部分だけでなく、値の登録とスタックも引用する必要があります..そして、それは難しいでしょうおそらく視聴者を獲得します。

現在、私/私たちはあなたのケースについてあなたよりもさらに知っているので、これ以上言うのは難しいです:)

于 2013-02-26T15:34:50.193 に答える