Oder kurz und DRY
Delphi-Quellcode:
unit Unit1;
interface
uses
SysUtils;
type
CryptoSysException =
class(
Exception );
function ReadSigData( AFileName: AnsiString ): AnsiString;
implementation
{$DEFINE MAYBE_BETTER}
function CMS_ReadSigDataToString(
szDataOut : PAnsiChar;
nDataOutLen: Integer;
szFileIn :
{$IFDEF MAYBE_BETTER}PAnsiChar
{$ELSE}AnsiString
{$ENDIF};
nOptions : Integer ): Integer;
stdcall;
external '
diCrPKI.dll';
function ReadSigData( AFileName: AnsiString ): AnsiString;
var
szDataOut : PAnsiChar;
nDataOutLen: Integer;
szFileIn :
{$IFDEF MAYBE_BETTER}PAnsiChar
{$ELSE}AnsiString
{$ENDIF};
nOptions : Integer;
begin
szDataOut :=
nil;
nDataOutLen := 0;
szFileIn :=
{$IFDEF MAYBE_BETTER}PAnsiChar( AFileName )
{$ELSE}AFileName
{$ENDIF};
nOptions := 0;
while True
do
begin
nDataOutLen := CMS_ReadSigDataToString(
szDataOut,
nDataOutLen,
szFileIn,
nOptions );
if nDataOutLen <= 0
then
raise CryptoSysException.Create( '
API call failed' );
// o.ä.
SetLength( Result, nDataOutLen );
if szDataOut <>
nil
then
Break;
szDataOut := PAnsiChar( Result );
end;
end;
end.
Das mit dem
AnsiString
Parameter wundert mich doch schon sehr ... sicher, dass das kein
PAnsiChar
ist?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)