2012-07-12 3 views
1

다음 절차를 사용하여 스트림을 인코딩합니다. 내가 코덱이 초기화되지 않는 심지어 키를로드하려고하지 않는 것을 발견 코드에 스테핑런타임에서 코덱을 올바르게 초기화하는 방법 (터보 파워 록 박스 3)?

C.EncryptStream(Strm,DFS); 전화

procedure SaveEncodedStream(Strm:TStream; LicFileName:String); 
var 
    C:TCodec; 
    CL:TCryptographicLibrary; 
    Sg:TSignatory; 
    KFS,DFS:TFileStream; 
    Dir:String; 
begin 
    CL:=TCryptographicLibrary.Create(nil); 
    C:=TCodec.Create(nil); 
    SG:=TSignatory.Create(nil); 

    Dir := ExtractFilePath(ParamStr(0)); 
    KFS:=TFileStream.Create(Dir+PublicKeyFile,fmOpenRead); 
    DFS:=TFileStream.Create(LicFileName,fmCreate); 

    try 
    C.CryptoLibrary:=CL; 
    C.BlockCipherId := 'native.RSA'; 
    C.ChainModeId := 'native.CBC'; 
    C.AsymetricKeySizeInBits := 1024; 
    SG.Codec:=C; 
    SG.LoadKeysFromStream(KFS,[partPublic]); 
    C.EncryptStream(Strm,DFS); 
finally 
    CL.Free; 
    C.Free; 
    SG.Free; 
    KFS.Free; 
    DFS.Free; 
end; 
end; 

받을 "잘못된 모드"오류가 발생했습니다. 양식에 componets을 배치하면 모든 것이 작동합니다. 하지만 Form이나 DataModule은 필요 없습니다.

답변

0

DataModule 제거 솔루션을 찾지 못했습니다. 구성 요소가 제대로 초기화해야하는 것처럼 보입니다. 따라서 해결 방법으로 모든 구성 요소가 디자인 모드로 구성된 전역 DataModule을 만들었습니다. 그 모듈을 SaveEncodedStream에서 다음과 같이 사용합니다 :

uses 
    ... EncryptDataModule; 
... 
var 
    BeenHere:Boolean = false; 
... 
procedure SaveEncodedStream(Strm:TStream; LicFileName:String); 
var 
    KFS,DFS:TFileStream; 
    Dir:String; 
begin 

    Dir := ExtractFilePath(ParamStr(0)); 
    KFS:=TFileStream.Create(Dir+PublicKeyFile,fmOpenRead); 
    DFS:=TFileStream.Create(LicFileName,fmCreate); 

    try 
    DataModule.SG.LoadKeysFromStream(KFS,[partPublic]); 
    if BeenHere then DataModule.C.Reset; 
    DataModule.C.EncryptStream(Strm,DFS); 
    BeenHere:=true; 
    finally 
    KFS.Free; 
    DFS.Free; 
    end; 
end;