2012-07-12 92 views
1

我使用以下过程来编码流。如何在运行时正确初始化编解码器(Turbo Power Lock Box 3)?

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; 

和接收“错误模式”

C.EncryptStream(Strm,DFS);呼叫

错误走进我发现,它甚至不会尝试加载键作为编解码器未初始化代码。当我将组件放在表单上时 - 一切正常。但我不需要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;