3

Delphi 7 を使用して、Word ドキュメントを OLEContainer にロードしようとしています。プログラムは、ターミナル サービス (Windows 2003) 環境で実行されています。

次のコードは、一部のユーザーに対してエラーを生成します。

procedure TForm1.Button1Click(Sender: TObject);
begin
  OleContainer1.CreateObjectFromFile('c:\tmp\test.doc', false);
end;

これは、OLEContainer とフォーム上のボタンを備えた単純なアプリケーションです。c:\tmp\test.doc は Word 2003 ドキュメントです。

一部のユーザーの場合、このコードはエラーを生成します

FORMATETC 構造が無効です。

他の人にとってはそうではありません。すべてのユーザーが同じターミナル サーバー上で実行されるため、同じ Word ドキュメントにアクセスする同じプログラムが実行されます。さらに、すべてのユーザーはスクリプトを使用して作成されているため、もちろんユーザー名などを除いて、まったく同じ設定になっています。

すべてのユーザーを管理者にしてみましたが、動作は変わりません。

誰が問題が何であるかについて何か考えを持っていますか?

4

2 に答える 2

0

いくつかのテストの結果、TOleContainer.LoadFromStreamメソッドが常に機能することがわかりました。問題は、このメソッドが単語ドキュメントを含むストリームではなく、OLEストリームを想定していることです。OLEストリームの形式をリバースエンジニアリングし、ヘッダー、単語ドキュメント、フッターの順に書き込むことで手動で作成しました。フッターは、256バイトのASCII-0で構成されているようです。

以下は、OLEストリームを作成するためのコードです。

function OLEStreamFromDoc(const inDocFileName : String) : TMemoryStream;
var
  aFileStream : TMemoryStream;
  aPadding    : Array[1..256] of byte;
  aHeader     : Array[1..12] of byte;
  aSize       : int64;
  i           : integer;
begin
  for i := low(aHeader) to High(aHeader) do
    aHeader[i] := 0;

  for i := low(aPadding) to High(aPadding) do
    aPadding[i] := 0;

  Result := TMemoryStream.Create;
  aFileStream := TMemoryStream.Create;
  try
    aFileStream.LoadFromFile(inDocFileName);
    aFileStream.Seek(0,0);
    aSize := aFileStream.Size + SizeOf(aPadding);

    aHeader[1] := Ord('B');
    aHeader[2] := Ord('D');
    aHeader[3] := Ord('O');
    aHeader[4] := Ord('C');
    aHeader[5] := 1;
    aHeader[9]  := aSize and 255;
    aHeader[10] := (aSize shr 8) and 255;
    aHeader[11] := (aSize shr 16) and 255;
    aHeader[12] := (aSize shr 24) and 255;
    Result.Write(aHeader, SizeOf(aHeader));
    aFileStream.SaveToStream(Result);
    Result.Write(aPadding, sizeof(aPadding));
    Result.Seek(0,0);
  finally
    aFileStream.Free;
  end;
end;
于 2012-12-03T07:43:21.560 に答える
0

Word オートメーションは IPersistFile をサポートしていると思います。これにより、ファイルをロードする別の方法が提供されるはずです。詳しくはこちらをご覧ください。

于 2012-11-29T17:13:37.893 に答える