問題タブ [getopenfilename]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - GetSaveFileName が CDERR_FINDRESFAILURE で失敗する
TOpenPictDialog (ソース コードは以下を参照) コンポーネントを作成しましたが、呼び出し時に特定の状況で最終的に失敗します。
結果 := TDialogFunc(DialogFunc)(DialogData);
Dialogs.pas で。DialogFunc は GetOpenFileName を正しく指しているので、後で CommDlgExtendedError を呼び出してテストを行い、何が問題なのかを調べます。CDERR_FINDRESFAILURE を返します。この場合、ダイアログは表示されません。テスト フォームには、ボタンと TOpenPictDialog コンポーネントのみが含まれています。ボタンを押すと、OpenPictDialog1->Execute が呼び出されます。それだけです。
非常に奇妙なことは、次の状況のいずれかの下で、(サイズ変更時に TListView がちらつく以外に) 完全に機能することです。
a) ExtDlgs を呼び出しフォームの "uses" に追加 b) 元の TOpenPictureDialog を呼び出さずにフォームに追加 c) TOpenPictDialog を含む PAS ファイルをプロジェクトに追加 (ただし、TOpenPictDialog は既にインストールされています)
1 つの呼び出しフォームを使用して C++ Builder アプリケーションを作成すると、 TOpenPictDialog が機能しなくなります (追加の TOpenPictureDialog コンポーネントを追加しても)。
c++ - QFileDialog::getOpenFileName は、明らかにプロジェクト名が原因で、デバッグ時にクラッシュしますか?
私は本当に私を混乱させる問題に遭遇しました。Windows 7 で Qt Creator 3.1.2 と Qt 5.3 を使用し、MSVC 10.0 コンパイラと Debugging Tools for Windows 8.1 の CDB を使用しています。(Windows 7 固有のデバッガーを探す必要があるかどうかはわかりませんが、今まで問題はありませんでした)。
問題: デバッグ中に QFileDialog::getOpenFileName() を使用しようとすると、プログラムが例外をスローします。
例外をトリガーしたため、下位は停止しました。
スレッド 0 で停止: Exception at 0x745f7736, code: 0xc0000005: read access violation at: 0x0, flags=0x0 (最初のチャンス)。
リリース/デバッグ ビルドは関係ありません。デバッガーを実行している場合、クラッシュします。そうでない場合は、機能します。なぜこれが起こったのかを理解するために、さまざまなことを試しました-getOpenFileNameをプログラムの別の部分に移動し、関数呼び出しのパラメーターを変更/削除しようとしました。基本的に、このファイル ダイアログを表示するために最低限必要なもの - メニューバー項目がクリックされたときに getOpenFileName() を呼び出す QApplication とメイン ウィンドウ。何も機能しませんでした。
次に、基本的に同じ新しいプロジェクトを作成しました。不可解なことに、それはうまくいきました。それで、後でいろいろいじり、メインプロジェクトから何かをコピーして、再びクラッシュし始めるまで、問題を見つけました。どうやら、それは.proファイルの「TARGET」によって設定された実行可能ファイル名です。PrimeWorldEditor (私のアプリケーションの名前) に設定すると、クラッシュします。他のものに変更すると、機能します。
したがって、私の最初の考えは、実行可能ファイルと名前を共有する残りのファイルがどこかに問題を引き起こしているということでした。ただし、ビルド フォルダーをクリアしたり、プロジェクトを再ビルドしたりしても、何の役にも立ちません。
問題の原因についてのアイデアが不足している時点で、実行可能ファイルと名前を共有するか、それを指す他のファイルを検索して見つけようとしましたが、失敗しました。問題が何であるかを誰かが知っている場合は、本当に助けていただければ幸いです。実行ファイルの名前を変更することで今のところ回避できますが、なぜこれが起こっているのかを突き止めて修正したいと思っています。
編集: 数人がコードを求めているので、クラッシュするプログラムの例を次に示します。繰り返しになりますが、これは、ターゲットの実行可能ファイル名を PrimeWorldEditor に設定してデバッガを実行した場合にのみクラッシュします。その他の状況では、期待どおりに機能し、getOpenFileName() ダイアログが開きます。
問題は私のセットアップに関連している可能性が高いと思うので、簡単に再現できるかどうかはわかりません.
編集2:問題に関連する情報を見つけるためにグーグルでしばらく費やしたことを付け加えたい. この投稿のように、私と同じ問題を抱えていると思われる人を何人か見つけましたが、それらの投稿には解決策がありませんでした.
string - VBAでGetOpenFileNameW?
さて、私はここでベースから外れているかもしれませんが、私がやりたいことは、GetOpenFileName の API 呼び出しのワイド (Unicode) バージョンを使用して、複数のファイルのリストを返すことです。
ここで、これを行う理由は次のとおりです。複数のファイルを選択する場合、ファイル名の合計文字数の制限は関数のバージョンによって異なります。
•ANSI: 32k 制限
•Unicode: 制限なし
ネットワークの奥深くに埋もれているディレクトリから多数のファイルを返すと、ANSI の 32k 文字制限をすぐに超える可能性があります。
したがって、私が行ったことは、動作中の ANSI 宣言関数を取得し、宣言されたすべてのstring
変数をlngptr
. 次に、これらに値を割り当てる必要がある場所で、StrPtr()
関数を使用して文字列値を変換しました。
さて、宣言された関数を呼び出す部分に到達したときにこの関数を呼び出そうとすると、lReturn = GetOpenFileNameU(OpenFile)
実際には何もしません!. エラーも何もありません。その行を過ぎても、何も起こりません。私は何を間違えましたか??
これが私が今いるところです:
qt - LinuxでのQFileDialog.getOpenFileNameの切り捨て
にあるファイル/home/rrg29876/villy/air.out
の場合、Windows で次のコードを実行するとすべて問題ありません。
しかし、Linuxでは次のようになります:
そして、ファイル名とフィルターが間違っているため、プログラムで何もできません..
誰かがこの切り捨てを私に説明したり、これを修正/回避する方法を提案したりできますか?