2012-01-04 6 views
2

この質問は私の問題を解決するかもしれないし、解決しないかもしれないが、私は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が整数値を持っているので、私はそれは無関係だと仮定します。

+0

NDAに署名する作者がいれば、それを支払うことができます。秘密よりも優れています。 – OnTheFly

+0

元の開発者は、.msgファイルを参照せずにデバッグできないことを伝えています。情報がまったくなくてもわかると思いますか?あなたは私たちにここに行くことはあまりありませんでした。 'WriteStorageToStream'へのソースがなければ、何が問題になるのか、' ApplyValue'に渡されるときに 'ms'が何を含んでいるのかわかりません(私が見たのは、' ms.Position'がセットされていないことです'WriteStorageToStream'の後で' ApplyValue'の前に0になります;実際には、読み込みメソッドが呼び出されたときにストリームの最後にあるため、ハングしている 'Stream.Read'かもしれません) –

+0

どのDelphiのバージョンを使用していますか? – Pateman

答えて

1

単純なメモリ上書きだったので、メモリ管理構造体を使用しようとするSetLengthが呼び出されたときにメモリマネージャのエラーが発生します。問題はWriteStorageToStream(SubStorage、ms)にあります。

これを見つけるには、FastMMデバッグバージョンでメモリ上書き検出オプションをオンにしてください。

+0

ありがとう、それはコンポーネントがメモリを台無しに表示され、私がしたいことを学んだようだ。 – Hald

1

SetLengthが3512文字のAnsiStringでフリーズすることは絶対にありません。それが凍っていて、どこか早く(WriteStorageToSteamのような)ではないことはどうですか?おそらく、これをデバッガで実行していると思われます。 CPUが凍結されている場合、そのプロセススレッドでCPUが100%にスパイクしますか?特定の電子メールでのみフリーズするという事実は、それらの電子メールの内容に何かがフリーズを引き起こしていることを示しています。 SetLengthの呼び出しは内容とは関係ありません。それは長さだけを気にします。

+0

デバッガは、errirが別の行にあると私の考え、コード、dcuはマッチしていないと言っています。地元の管理者がそれをしないと、それほど似ていないのです。私はすべてのオブジェクトファイルを削除して、このようなものがあれば再構築します。 –

+0

私はデルファイをインストールしたマシンのローカル管理者であるため、私はスルーしていません。私はshowmessagesの素晴らしいデバッグ方法を使用しました。 'showmessage( '1');' 'SetLength(s、brLen);' 'showmessage( '2'); < - 決して表示されていません。 ' CPUは〜しません。 私は電子メールと関係があると確信しています。このコードはOutlookの電子メールのプロパティで実行されており、フリーズする場所はバイナリプロパティを 'value'変数に読み込む部分です。 – Hald

+0

標準ユーザーだけのマシンにユーザーを作成します。次に、デバッガを使用します。 –

関連する問題