いくつかの Web サービスを提供する Delphi Web サーバーを持っています*。それらの 1 つは、PDF レポートを生成して返すことになっています。
PDF の作成は QReport で行われ、次に ExportToFilter プロシージャで PDF ファイルにエクスポートされます。
このルーチンは、アプリケーション内から呼び出されると正常に動作しますが、TIdTCPServer の背後で呼び出されると、ハングして終了しません。それをデバッグすると、ぶら下がっているポイントがわかりました:
(注:私は今家にいて、ソースコードを持っていません。覚えている限り正確にquickrpt.pasのソースを再現しようとします).
procedure TCustomReport.ExportToFilter(TQRDocumentFilter filter);
...
AProgress := TQRFormProgress.Create(Application); // Hangs on this line
AProgress.Owner := QReport;
if ShowProgress then AProgress.Show;
QReport.Client := AProgress;
...
Web を検索すると、このページ(1) で、ShowProgress を False に設定し、ShowProgress が false に設定されているときに進行状況フォームを作成しないようにコードを編集するという提案が見つかりました (明らかに、これは QReport がスレッドセーフではないためです)。 )。
それで、コードを編集したところ、次のようになりました。
procedure TCustomReport.ExportToFilter(TQRDocumentFilter filter);
...
if ShowProgress then
begin
AProgress := TQRFormProgress.Create(Application);
AProgress.Owner := QReport;
AProgress.Show;
QReport.Client := AProgress
end;
...
さて、レポートが出てきました。しかし、その後、サービスは無効なポインター例外に到達します (これは追跡できません)。サービスへの次の呼び出しは正常に完了しますが、サービスをシャットダウンすると**、無効なポインター例外で再び泣き言を言い始め、「MyServer has commited an invalid action and must be closed (MyServer has commited an invalid action and must be closed (MyServer は無効なアクションをコミットしたため、閉じる必要があります)] ウィンドウ メッセージが再び数回表示されます) 、次にポインター例外だけが発生し、エラー216になります(これは、私が知る限り、Windowsアクセス許可に関連しています)。
ありがとう!
更新 (1 月 5 日) : Scott W. さん、ご回答ありがとうございます。実際、いくつかの調査の後、メイン スレッドのみが一部のコンポーネントにアクセスできるという別の提案を見つけました。そこで、QR コードを通常の状態に戻し、TThread 内の Synchronize 呼び出しからメイン メソッドを呼び出しました (メイン スレッドがそれを処理するように)。しかし、私はまだ同じエラーが発生します。
あなたは、QR 4 でサービスとして PDF を生成できたと述べています。QR 3 を使用しているため、おそらくそれが私にとってはうまくいかない理由です。 TIdTCPServer (これは私の場合で、Web サービスを提供します) または単独で実行する場合 (たとえば、バッチ プロセス中)。
私のQRバージョンが問題であるかどうか知っている人はいますか? ありがとう!
* Windows XP SP2 で Delphi 7 と QuickReport 3 を実行しています。サーバーは Indy をベースにしています。
** サーバーには、Windows アプリケーションと Windows サービスの 2 つのバージョンがあります。どちらも同じ内部ロジックを呼び出し、両方のバージョンで問題が発生します。
更新 (3 月 8 日) : 結局、私の問題は、私の印刷ルーチンが別の dll にあり、デフォルトのメモリ管理モジュールがやや安っぽいことでした。.dpr の最初の使用を ShareMem に設定すると、メモリ管理モジュールが Borland の実装で上書きされ、問題が解決しました。
uses
ShareMem, ...