この質問は私の問題を解決するかもしれないし、解決しないかもしれないが、私はDelphi/Windowsがこれを引き起こす方法でどのように振る舞うかを学びたい。SetLengthの呼び出し時にアプリケーションがフリーズする
サードパーティコンポーネントを使用してOutlook .msgファイルを読み込むアプリケーションがあります。
場合によっては(特定のメール)、SetLengthを呼び出すときにアプリケーションがフリーズします(コンポーネントの内部には、ソースコードがあります)。 これは、setLengthがファイル(ストリーム)からプロパティをロードするプロシージャの内部で呼び出されたときに発生することがあります。それは同じメールで同じ場所に起こり、毎回再現することができます。
明らかにコンポーネントは多くのことを行い、おそらくこれのいくつかの副作用です。ただし、メールには第三者コンポーネントの開発者に送信できない機密データが含まれているため、デバッグするために送信することはできません。
プログラムは、ドメイン上のWindows XPで実行されています。 奇妙なことは、プログラムを実行しているユーザーがローカルマシン上で管理者に設定されていない場合にのみ発生するということです。正確には何WriteStorageToStream
ms := TMemoryStream.Create;
try
WriteStorageToStream(SubStorage, ms);
ApplyValue(ms, ms.Size)
finally
ms.Free;
end;
procedure ApplyValue(Stream: TStream; brLen: Integer);
var
s: AnsiString;
begin
SetLength(s, brLen); // this freezes it all. brLen=3512
FillChar(s[1], brLen, #0);
Stream.Read(s[1], brLen);
Value := s;
end;
は私には不明であるが、我々は、ストリームを操作していないとbrLenが整数値を持っているので、私はそれは無関係だと仮定します。
NDAに署名する作者がいれば、それを支払うことができます。秘密よりも優れています。 – OnTheFly
元の開発者は、.msgファイルを参照せずにデバッグできないことを伝えています。情報がまったくなくてもわかると思いますか?あなたは私たちにここに行くことはあまりありませんでした。 'WriteStorageToStream'へのソースがなければ、何が問題になるのか、' ApplyValue'に渡されるときに 'ms'が何を含んでいるのかわかりません(私が見たのは、' ms.Position'がセットされていないことです'WriteStorageToStream'の後で' ApplyValue'の前に0になります;実際には、読み込みメソッドが呼び出されたときにストリームの最後にあるため、ハングしている 'Stream.Read'かもしれません) –
どのDelphiのバージョンを使用していますか? – Pateman