1

Windows 8 (64 ビット) で 64 ビット アプリケーションの CreateWindowExA を呼び出す際の既知の問題はありますか?

コンテキスト: FOX Toolkit (FOX STABLE 1.6.46) を使用しています。最も単純なHello Worldサンプル (「hello」) をコンパイルして実行するとCreateWindowExA、ファイル FXWindow.cpp:1345 の呼び出しはゼロの HWND ハンドルを返します (ただしGetLastError()、エラーは報告されません)。これは、1 つの特定の構成でのみ発生します。

OS        | OS Platform | App compiled for | CreateWindowExA succeeds? |
Windows 7 |    32-bit   |      32-bit      |         YES               |
Windows 7 |    64-bit   |      32-bit      |         YES               |
Windows 7 |    64-bit   |      64-bit      |         YES               |
Windows 8 |    64-bit   |      32-bit      |         YES               |
Windows 8 |    64-bit   |      64-bit      | NO! (returns NULL)        |

CreateWindowExA最後の構成と何か違う点はありますか。ウィンドウ プロシージャはすべての場合で同じであり、受信するメッセージは次の順序であることに注意してください。

  • WM_GETMINMAXINFO(転送先DefWindowProc)
  • WM_NCCREATE(転送先DefWindowProc)

最後の構成では、継続してNULLWM_NCDESTROYを返します。CreateWindowExA

他のすべての構成では、WM_NCCALCSIZEが送信され、最後にWM_CREATE.

4

3 に答える 3

2

ソースの問題を見つけました:FOXはウィンドウプロシージャの関数シグネチャを誤って次のように定義しています

long CALLBACK wndproc(FXID hwnd,unsigned iMsg,unsigned int wParam,long lParam);

FXIDtypedefをにしたvoid*)、64ビットWindowsの場合、wParamlParamは32ビットのみですが、64ビットである必要があります。正しい関数シグネチャ(FOXタイプを使用)は次のとおりです。

FXival CALLBACK wndproc(FXID hwnd,unsigned int iMsg,FXuval wParam,FXival lParam); 

では、なぜ64ビットWindowsからWindows7までで動作したのでしょうか。MSDNが言うように:

lParamofWM_NCCREATEには、作成中のウィンドウに関する情報を含むCREATESTRUCT構造体へのポインターが含まれています。CREATESTRUCTのメンバーは、CreateWindowEx関数のパラメーターと同じです。

Windows 7(64ビット)以下では、その構造は常に4GB未満のメモリに割り当てられ、ポインタ値が32ビットに切り捨てられても、正しい場所を指していることがあります。Windows 8の時点では、その構造は64ビットメモリ範囲のどこかに割り当てられており、切り捨てると誤ったポインタが生成される可能性があります。

私が確信していないことが1つだけあります。それはCALLBACK__stdcall引数が右から左にスタックにプッシュされることです。それで、の誤った宣言を考えると、それはまだ正しいパラメータをwindproc取得していますか?iMsghwnd

于 2012-11-14T09:19:40.590 に答える