VCL スタイルを有効にして単純な TOpenDialog を使用すると、クラッシュまたは例外が発生します。
スタイルが有効になっていない場合、ダイアログはもちろん正常に機能します。この問題は、C++ Builder 10 および 10.1 Professional で発生します。
再現するには:
- スタイルを使用する単純な VCL フォームを作成する
- TComboBox、TButton、および TOpenDialog をフォームに追加する
ボタンの OnClick イベントに次のコードを追加します。
OpenDialog1->Execute(); for(int i=0; i<100; i++) ComboBox1->Items->Add("test text"); ComboBox1->ItemIndex = 1;
アプリケーションを実行し、ボタンをクリックしてファイルを選択します
- 私にとって、これは「システムリソース不足」という例外につながります
このバグは、Windows 7 Enterprise および Windows 8.1 Pro で再現できます。TSaveDialog にも同じ問題があります。
私にとって奇妙なことは、この例外に関して、Web 上で同様の問題を見つけることができないことです。私の意見では、これが必要なのは VCL スタイルと TOpenDialog だけなので、Web でこれに関する詳細情報を期待したいと思います。
少し似たものしか見つかりませんでしたが、例外ではなく、ネイティブ VCL スタイルに関する解決策もありません。
TOpenDialog でファイルを右クリックすると、カスタム スタイルを使用すると無効な文字が表示される
VCL スタイルの別の問題についてどこかで読んだ SystemHooks shDialogs (スクリーンショットを参照してください) も無効にしようとしましたが、役に立ちませんでした。
※2016/05/26追記※
Remy Lebeau は MCVE を求めています。私はすべてを質問に入れようとしましたが、明確にするために、MCVEの要約をここに示します。
- デフォルト設定で新しい VCL プロジェクトを作成する
- TComboBox、TButton、および TOpenDialog をフォームにドロップする
ボタンの OnClick イベントに次のコードを追加します。
void __fastcall TForm1::Button1Click(TObject *Sender) { OpenDialog1->Execute(); for (int i=0; i<100; i++) ComboBox1->Items->Add(L"test text"); ComboBox1->ItemIndex = 1; // <- exception occurs here }
プロジェクト オプションで VCL スタイル 'Smokey Quartz Kamri' を有効にします。
- プログラムを実行し、ボタンを押し、任意のファイルを選択し、TOpenDialog で [OK] を選択します。
ここで、例外に必要なのはこれだけです。
私の意見では、Execute() の呼び出しはいくつかの VCL 構造を台無しにし (スタイルが有効になっている場合のみ)、別の VCL アイテム (私の場合はコンボボックス) へのアクセスがクラッシュにつながります。
私は今、すべての人がこのクラッシュを経験しているわけではないことを認識しています。100% 検証可能な例ではない場合は、ご容赦ください。
しかし、このクラッシュが発生したのは私と同僚だけではありません (現在、3 つの異なる OS バージョンの 4 つの異なるコンピューターでテストされています)。
※2016/05/27追記※
シングル ステップに対する Tom Brunberg の要求に関して、呼び出し内のアドレス 005459F4 のスクリーンショットで、WndProc 内のどこかで例外が発生します。
さらに一歩進めると、TCustomCombo.WndProc のどこかに着陸しています。その後は、WndProc でループが繰り返されるため、さらに追跡するのが非常に難しく、例外が発生する最終的な場所に到達できないようです。
※2016/05/27秒編集※
OK、クラッシュの正確な場所を特定することができました。VCL.Graphics 内の関数 CopyBitmap にあります。最初のスクリーンショットでは、次の行で例外が発生します。
結果:= GDICheck(CreateCompatibleBitmap(ScreenDC, bmWidth, bmHeight))
2 番目のスクリーンショットの関数 GDICheck() では、変数 Value がデバッガーでゼロであるため、関数 GDIError が呼び出されます。そこでは、ErrorCode もゼロであり、これにより OutOfResources が呼び出されます。
これがさらに絞り込むのに役立つことを願っています。
※2016/07/19追記※
ここでは誰も問題を抱えていないようだったので、別の試みをしました。会社の私の同僚が、C++ Builder 10.1 Berlin を英語で新しくインストールしました (おそらくドイツ語の IDE が原因だと思いました)。 StylesCrashTest アプリをインストールし、再作成しました。結果は同じで、ファイルを選択してダイアログで「開く」を押すと、すぐにクラッシュします。
ここにテスト プロジェクトをアップロードしました http://fboom.me/file/9904e22ddd22b/StylesCrashTest.zip
生成されたリリース exe はこちら http://fboom.me/file/368d0b62cc1a7/StylesCrashTest.exe
exe は、virustotal.com の多くのウイルス対策スキャナーでテストされています。 https://www.virustotal.com/de/file/e96f2e7eb80c162c2e5998decc15f26615c9fc76efec73379dd2e2140e4eba08/analysis/1468952442/
皆さんがexeとテストプロジェクトをテストできれば役に立ちます。これにより、問題をコンピューター関連またはインストールされたIDE/生成されたexeに関連する問題に分けることができます。もちろん、これは誰かが問題を再現できる場合に限ります。
この exe を使用すると、商用環境の 2 台の Windows 7 x64 Enterprise コンピューターでアプリがクラッシュします。ただし、Windows 8.1 x64 Prof を搭載した私の個人用コンピューターではクラッシュしません。
現在、私は行き詰まっています。ミュンヘンの町の外では誰も問題を再現できないようですが、2 台の異なるコンピューターで問題が発生していることは間違いありません。
この問題は Embarcadero にも提出されています (ログインが必要です): https://quality.embarcadero.com/browse/RSP-15019
悲しいことに、現時点では、これは VCL スタイルを使用するためのショップ ストッパーです。