2010-12-14 20 views
6

Đây là từ trình xử lý tên tùy chỉnh được thực hiện trong Delphi mà tôi sử dụng để tải các tệp vào thành phần webbrowser.Cách miễn phí TOleStream trong bit mã này

 

Datastream:IStream; 

var 
    F: TFileStream; 
    Dummy: INT64; 
begin 

    F:=TFileStream.Create(strfilename fmOpenRead); 
    CreateStreamOnHGlobal(0, True, DataStream); 
    TOleStream.Create(DataStream).CopyFrom(F, F.Size); 
    DataStream.Seek(0, STREAM_SEEK_SET, Dummy); 
    TotalSize := F.Size; 
    F.Free; 
end; 

Vấn đề là Fastmm4 đưa ra lỗi rò rỉ bộ nhớ khi chương trình kết thúc và nói rằng TOleStream không được giải phóng. Làm thế nào để giải phóng nó? Nếu tôi đặt TOleStream trong một biến và gán như thế này

 
var 
TOS:TOleStream; 

TOS:=TOleStream.Create(DataStream) 
TOS.CopyFrom(F, F.Size); 

.. 
TOS.Free; 
End; 

tôi nhận được một lỗi (EAccessViolation trỏ đến TComObject.ObjRelease trong ComObj) cuối cùng khi tôi giải phóng biến TOS. Tôi sẽ đánh giá cao ý kiến ​​của bạn và giúp đỡ. Vấn đề này đã làm tôi lo lắng một lúc rồi.

Tôi cũng tự hỏi nếu nó có thể là một cái gì đó với FastMM4? Nó có thể cung cấp thông tin sai lệch không? Trong một chút mã như sau. TOLEStream được giải phóng như thế nào?

 
f.SaveToStream(TOleStream.Create(DataStream)); 

Và có cách nào để gửi dữ liệu đến luồng dữ liệu mà không sử dụng TFileStream không?

Hi Remy, Bạn có thể tìm thấy một dự án trình diễn làm việc của trình xử lý không gian tên với fastmm và thủ tục vấn đề ở đây: http://mode5.webs.com/namespace.7z Khi tải dự án, bấm vào nút để có xử lý namespace tải các tập tin. Khi bạn thoát, bạn sẽ nhận được lỗi fastmm. Trân trọng,

+2

Xin chào, Chế độ, chào mừng bạn đến với StackOverflow. Đó là một câu hỏi khá hay, nhưng nó sẽ giúp ích nếu chúng tôi biết lỗi bạn nhận được khi bạn giải phóng nó. Bạn có thể chỉnh sửa câu hỏi của bạn và sao chép lỗi bạn nhận được vào đây cho chúng tôi không? Cảm ơn. –

+0

FastMM không sai. Bạn đang cố gắng làm gì? Tải một tập tin vào một IStream và làm điều gì đó với nó? Tệp có nên được sửa đổi hoặc bạn có muốn nó chỉ đọc không? –

Trả lời

3

Nếu bạn cần truyền giao diện IStream cho một thứ gì đó, bạn nên nhìn vào đối tượng TStreamAdapter, bạn có thể tạo một đối tượng trên TFileStream và truyền giao diện IStream của nó.

+0

Cảm ơn Stijn, tôi sẽ thử rằng – Mode

+0

Cảm ơn Stijn, Bạn có thể xây dựng một chút? Khi tôi thử sử dụng Datastream: = TStreamadapter.create (f, soOwned); Fastmm4 ném một lỗi nói rằng tôi đang cố gắng sử dụng một giao diện của một đối tượng giải phóng. Một số mã trình diễn sẽ hữu ích. Cảm ơn một lần nữa. – Mode

+0

Tôi không chắc tôi hiểu ý bạn là gì bởi "trình xử lý tên tùy chỉnh được thực hiện trong Delphi mà tôi sử dụng để tải các tệp vào thành phần webbrowser" Tôi không nghĩ rằng trình xử lý không gian tên tùy chỉnh là cách tốt nhất để tải nội dung webbrowser. Có IInternetProtocol, nhưng đó là rất nhiều công việc để thực hiện chính mình, tôi biết vì tôi đã thử ở đây: http://xxm.sf.net/ –