📄 unit1.~pas
字号:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,CAPICOM_TLB;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function Form1.SignXML(filepathname:String;browse:Smallint):boolean;
var
FileSaveStream:TFileStream;
MemoryStream:TMemoryStream;
SignedString:WideString;
P:PByteArray;
VarArray:Variant;
oUtilities:CAPICOM_TLB.IUtilities;
Store: CAPICOM_TLB.IStore;
SignedData: CAPICOM_TLB.ISignedData;
Signer:CAPICOM_TLB.ISigner;
Signer2:ISigner2;
Attribute:IAttribute;
begin
if detached then begin
SaveDialog.FileName:=filepathname + '.p7s'
end else begin
SaveDialog.FileName:=filepathname + '.p7m';
end;
SaveDialog.Title:='...message.............';
if not SaveDialog.Execute then Exit;
if not Assigned(FFileStream) or (FFileStream.Size=0) then begin
FFileStream:=TFileStream.Create(filepathname, fmOpenRead or fmShareExclusive);
end;
if not Assigned(FFileStream) or (FFileStream.Size=0) then exit;
MemoryStream:=TMemoryStream.Create;
FFileStream.Position:=0;
MemoryStream.CopyFrom(FFileStream, FFileStream.Size);
MemoryStream.Position:=0;
VarArray:=VarArrayCreate([0, MemoryStream.Size-1], VarByte);
P:=VarArrayLock(VarArray);
try
Move(MemoryStream.Memory^, P^, MemoryStream.Size);
finally
VarArrayUnlock(VarArray);
end;
oUtilities:=CoUtilities.Create;
Store:=CoStore.Create;
Store.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_READ_ONLY);
SignedData := CoSignedData.Create;
SignedData.Content:=oUtilities.ByteArrayToBinaryString(VarArray);
Signer:=CoSigner.Create;
Attribute:=CoAttribute.Create;
Attribute.Name:=CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME;
Attribute.Value:=Now;
Signer.AuthenticatedAttributes.Add(Attribute);
Signer2:=signer as ISigner2;
MemoryStream.Clear;
MemoryStream.Position:=0;
VarClear(VarArray);
VarArray:=oUtilities.BinaryStringToByteArray(SignedData.Sign(Signer2, detached, CAPICOM_ENCODE_BINARY));
if (not VarIsArray(VarArray)) then raise Exception.Create('.....');
P:=VarArrayLock(VarArray);
try
MemoryStream.Write(P^, VarArrayHighBound(VarArray,1)+1);
finally
VarArrayUnlock(VarArray);
end;
MemoryStream.Position:=0;
FileSaveStream:=TFileStream.Create(SaveDialog.FileName, fmCreate or fmShareExclusive);
FileSaveStream.CopyFrom(MemoryStream, MemoryStream.Size);
Form.Label.Caption:='' + SaveDialog.FileName;
Form.ShowModal;
FreeAndNil(FileSaveStream);
FreeAndNil(MemoryStream);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -