6

多数のアプリケーションを Windows XP から Windows 7 に移行する過程にあり、Word Automation で古い問題に遭遇しました。

アプリケーションの 1 つで、既に開いている場合を除き、Word に接続しようとすると「呼び出し先によって呼び出しが拒否されました」という問題が発生しました。Delphi 2000 / Windows XP では、次のコードで回避しました。

WordApp.Connect;
WordApp.Visible := True;
WordApp.Documents.Add(Template, EmptyParam, EmptyParam, EmptyParam);
WordApp.ChangeFileOpenDirectory(jdir);
WordApp.Visible := False;
WordDoc.ConnectTo(WordApp.ActiveDocument);

これはもはや Windows 7 ではうまくいかず、XE2 で再コンパイルしても役に立たないようです。

ここで Visual Studio に関連する関連する質問を見てきました- Delphi にそれを適用する方法を知っている人は誰でも (この段階では XE2 で問題ありません)

ダン

4

1 に答える 1

9

「呼び出し先によって呼び出しが拒否されました」エラーは、接続中/接続中のインスタンスが現在インタラクティブモードになっている場合に発生します。たとえば、ダイアログを開きます。または、Excelでは、セルが編集されているか、ユーザーがアプリケーションから切り替えることによって編集中のセルが中断された状態になっている場合でも、ユーザーが戻ると、編集が完了したように見えますが、インタラクティブです別のセルが選択されるまで、モードは終了しません。

このため、別のインスタンスがすでに開いていない限り、接続時にこのエラーが発生する理由がわかりません。開いている(そして表示されている)インスタンスがない場合、Wordをインタラクティブモードにすることはできず、エラーが発生することはありません。あなたの治療法が単に本当の問題を回避しただけである可能性はありますか?

とはいえ、インタラクティブモードのインスタンスに接続しようとしている状況にあります。事前に、またはコードによって引き起こされます。XPからWindows7に切り替えると、UACが原因の可能性として頭に浮かびます。

私は回避策を廃止し、それがあなたをどこに連れて行くかを見ていきます。

Wordの自動化については、常に次のことを確認します。

  • ckNewInstanceのConnectKindを使用して専用インスタンスに接続し、
  • 専用インスタンスを表示しないようにするか、
  • すべて完了した後でのみ表示できるようにし、インスタンスをユーザーに引き渡すことができるようにします。

表示されている(したがって専用ではない)Wordインスタンスに対して自動化する以外に選択肢がない場合は、このエラーが発生する可能性に対処する必要があります。その場合は、何が起こっているかをユーザーに警告し、再試行を提供するようにしてください。

更新 @Hendraのコメントで言及されているEmbarcaderoフォーラムのスレッドには、非常に便利なMSDNドキュメントへのリンクが含まれています

于 2012-06-28T21:12:02.427 に答える