TStreamAdapter를 상송받아 생성된 TCFStreamAdapter
type
TCFStreamAdapter = class(TStreamAdapter)
public
function Stat(out statstg: TStatStg; grfStatFlag: Longint): HResult; override; stdcall;
end;
function TCFStreamAdapter.Stat(out statstg : TStatStg; grfStatFlag : Integer): HResult;
begin
result := inherited Stat(statstg, grfStatFlag);
statstg.pwcsName := nil;
end;
응용 예]
procedure LitEtEcritResStream(var Image : TGPBitmap; NomRes, ResType : string);
var
Res : TResourceStream;
StreamInf :IStream;
begin
Res := TResourceStream.Create(hInstance, NomRes, PChar(ResType));
StreamInf := TCFStreamAdapter.Create(Res);
try
Image := TGPBitmap.Create(StreamInf);
finally
StreamInf := nil;
end;
Res.Free;
end;
Use the overriden TStreamAdapter :
TCFStreamAdapter = class(TStreamAdapter)
public
function Stat(out statstg: TStatStg; grfStatFlag: Longint): HResult; override; stdcall;
end;
In your Code :
But in your code :
LIStream := TStreamAdapter.Create(LStream);
LStream.LoadFromFile('C:\InputFile.emf');
if you do this instead, does it works ? :
LStream.LoadFromFile('C:\InputFile.emf');
LIStream := TStreamAdapter.Create(LStream);
실질적으로 위의 코드를 사용하게 된 계기는 GDIPLUS를 이용해 어떤 프로그램을 만들게 되면서이다. GDIPLUS에서 TGpImage 객체를 Create할때, 직접 로컬 이미지 파일 경로를 넣어주거나, ISTREAM을 넣어주게 되있는데, 로컬 파일을 사용할때마다 불러오는게 그다지 맘에 들지 않았고, 이미지에 변화를 주고자 할때 GDIPLUS 자체보다는 TBItmap객체를 직접 컨트롤 하는게 아직은 익숙해서 TBitmap을 Stream에 저장하고 이를 다시 IStream으로 변환하여 TGpImage로 생성하는 과정을 거쳤다.
실질적으로 국내 델파이 관련 포털사이트 질답란등을 살펴보면, TStreamAdapter에 문제가 있다는 말이 있었고, 이때문에 대안 방안을 찾다가 http://www.progdigy.com의 질답란에서 발췌하게 되었다.LStream := TMemoryStream.Create;
LIStream := TCFStreamAdapter.Create(LStream);
LStream.LoadFromFile(strMapFn);Map_Image := TGpImage.Create(LiStream);