fpexif: Fix compilation under Delphi

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6081 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz 2017-12-02 18:30:58 +00:00
parent e03afa62f1
commit 13726c172b
23 changed files with 169 additions and 49 deletions

View File

@ -1355,6 +1355,8 @@ procedure TGPSPositionTag.SetAsString(const AValue: String);
var
deg: Double;
begin
if AValue = '' then
exit;
if TryStrToGps(AValue, deg) then
SetAsFloat(deg)
else

View File

@ -580,6 +580,7 @@ procedure TIptcDateTag.SetAsString(const AValue: String);
var
d: TDateTime;
fmt: String;
fs: TFormatSettings;
begin
fmt := GetFormat;
if fmt = IPTC_DATE_FORMAT then
@ -641,6 +642,7 @@ procedure TIptcTimeTag.SetAsString(const AValue: String);
var
t: TDateTime;
fmt: String;
fs: TFormatSettings;
begin
fmt := GetFormat;
if fmt = IPTC_TIME_FORMAT then

View File

@ -118,6 +118,7 @@ var
tagID: TTagID;
s: String;
w: Word;
sa: ansistring;
begin
Result := nil;

View File

@ -440,6 +440,9 @@ var
buf: TBytes;
reader: TBasicMetadataReader;
bigEndian: Boolean;
{$IFNDEF FPC}
sa: ansistring;
{$ENDIF}
begin
p := AStream.Position;
streamsize := AStream.Size;
@ -630,6 +633,7 @@ const
var
jfifSegment: TJpegJFIFSegment;
writer: TBasicMetadataWriter;
sa: ansistring;
begin
// Write Start-of-image segment (SOI)
AStream.WriteBuffer(SOI_MARKER, SizeOf(SOI_MARKER));

View File

@ -113,9 +113,9 @@ function IPTCDateStrToDate(AValue: String): TDateTime;
function IPTCTimeStrToTime(AValue: String): TDateTime;
{ For silencing the compiler... }
procedure Unused(const A1);
procedure Unused(const A1, A2);
procedure Unused(const A1, A2, A3);
procedure Unused(const A1); overload;
procedure Unused(const A1, A2); overload;
procedure Unused(const A1, A2, A3); overload;
implementation
@ -1433,7 +1433,9 @@ end;
// Silence compiler warnings due to unused parameters
// (code adapted from TAChart)
//==============================================================================
{$IFDEF FPC}
{$PUSH}{$HINTS OFF}
{$ENDIF}
procedure Unused(const A1);
begin
end;
@ -1445,7 +1447,9 @@ end;
procedure Unused(const A1, A2, A3);
begin
end;
{$IFDEF FPC}
{$POP}
{$ENDIF}
end.

View File

@ -31,10 +31,13 @@
-M
-$M16384,1048576
-K$42200000
-E"D:\Prog_Lazarus\wp-laz\fpexif\tests\multiread"
-N"D:\Prog_Lazarus\wp-laz\fpexif\tests\multiread\output\dcu\Delphi7"
-N"output\dcu\Delphi7"
-LE"d:\programme\borland\delphi7\Projects\Bpl"
-LN"d:\programme\borland\delphi7\Projects\Bpl"
-U"..\..;common"
-O"..\..;common"
-I"..\..;common"
-R"..\..;common"
-w-UNSAFE_TYPE
-w-UNSAFE_CODE
-w-UNSAFE_CAST

View File

@ -90,11 +90,11 @@ MaxStackSize=1048576
ImageBase=1109393408
ExeDescription=TeeChart 2014 Components
[Directories]
OutputDir=D:\Prog_Lazarus\wp-laz\fpexif\tests\multiread
UnitOutputDir=D:\Prog_Lazarus\wp-laz\fpexif\tests\multiread\output\dcu\Delphi7
OutputDir=
UnitOutputDir=output\dcu\Delphi7
PackageDLLOutputDir=
PackageDCPOutputDir=
SearchPath=
SearchPath=..\..;common
Packages=Tee97;TeeUI97;TeeDB97;TeePro97;TeeGL97;TeeImage97;TeeLanguage97;TeeWorld97
Conditionals=
DebugSourceDirs=
@ -134,17 +134,19 @@ OriginalFilename=
ProductName=
ProductVersion=9.0.0.0
[Excluded Packages]
D:\Prog_Delphi\common\Components\3rdParty\TeeChart\Sources\Compiled\Delphi7\Bin\DclTeeMaker17.bpl=TeeMaker
D:\Prog_Delphi\common\Components\3rdParty\TeeChart\Sources\Compiled\Delphi7\Bin\DclTeeMaker17.bpl=TeeMaker
D:\Programme\Borland\Delphi7\Lib\HelpCtxD7.bpl=HelpScribble HelpContext Property Editor for Delphi 7
[HistoryLists\hlUnitAliases]
Count=1
Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
[HistoryLists\hlSearchPath]
Count=1
Item0=D:\Prog_Lazarus\git\dexif-afriess-master
Count=2
Item0=..\..;common
Item1=D:\Prog_Lazarus\git\dexif-afriess-master
[HistoryLists\hlUnitOutputDirectory]
Count=1
Item0=D:\Prog_Lazarus\wp-laz\fpexif\tests\multiread\output\dcu\Delphi7
Count=2
Item0=output\dcu\Delphi7
Item1=D:\Prog_Lazarus\wp-laz\fpexif\tests\multiread\output\dcu\Delphi7
[HistoryLists\hlOutputDirectorry]
Count=2
Item0=D:\Prog_Lazarus\wp-laz\fpexif\tests\multiread

View File

@ -50,8 +50,7 @@
<DCC_AssertionsAtRuntime>false</DCC_AssertionsAtRuntime>
<DCC_DebugInformation>1</DCC_DebugInformation>
<DCC_Description>TeeChart 2014 Components</DCC_Description>
<DCC_ExeOutput>D:\Prog_Lazarus\wp-laz\fpexif\tests\multiread</DCC_ExeOutput>
<DCC_DcuOutput>D:\Prog_Lazarus\wp-laz\fpexif\tests\multiread\output\dcu\Delphi</DCC_DcuOutput>
<DCC_DcuOutput>output\dcu\Delphi</DCC_DcuOutput>
<DCC_UsePackage>Tee97;TeeUI97;TeeDB97;TeePro97;TeeGL97;TeeImage97;TeeLanguage97;TeeWorld97;$(DCC_UsePackage)</DCC_UsePackage>
<SanitizedProjectName>MultiRead_Delphi</SanitizedProjectName>
<DCC_Namespace>Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace)</DCC_Namespace>
@ -60,6 +59,7 @@
<VerInfo_Release>11</VerInfo_Release>
<VerInfo_Locale>1033</VerInfo_Locale>
<VerInfo_Keys>CompanyName=Steema Software;FileDescription=;FileVersion=9.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=9.0.0.0</VerInfo_Keys>
<DCC_UnitSearchPath>common;..\..;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''">
<DCC_Namespace>System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>

View File

@ -105,6 +105,16 @@
<OtherUnitFiles Value="common;..\.."/>
<UnitOutputDirectory Value="output\ppu\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<UseExternalDbgSyms Value="True"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">

View File

@ -1,6 +1,6 @@
object MainForm: TMainForm
Left = 326
Top = 138
Left = 299
Top = 192
Width = 1040
Height = 599
ActiveControl = BtnRunTest
@ -133,7 +133,7 @@ object MainForm: TMainForm
TabOrder = 2
object Bevel2: TBevel
Left = 4
Top = 494
Top = 492
Width = 608
Height = 4
Align = alBottom
@ -141,18 +141,21 @@ object MainForm: TMainForm
end
object Panel5: TPanel
Left = 4
Top = 498
Top = 496
Width = 608
Height = 25
Height = 27
Align = alBottom
AutoSize = True
BevelOuter = bvNone
TabOrder = 0
DesignSize = (
608
27)
object MismatchInfo: TLabel
Left = 0
Top = 0
Width = 361
Height = 25
Height = 27
Align = alLeft
AutoSize = False
Caption = 'MismatchInfo'
@ -165,16 +168,27 @@ object MainForm: TMainForm
Top = 0
Width = 69
Height = 25
Anchors = [akTop, akRight]
Caption = 'Run test'
TabOrder = 0
OnClick = BtnRunTestClick
end
object BtnInfo: TButton
Left = 456
Top = 0
Width = 75
Height = 25
Anchors = [akTop, akRight]
Caption = 'Info'
TabOrder = 1
OnClick = BtnInfoClick
end
end
object Memo: TMemo
Left = 4
Top = 4
Width = 608
Height = 490
Height = 488
Align = alClient
ScrollBars = ssBoth
TabOrder = 1

View File

@ -165,6 +165,20 @@ object MainForm: TMainForm
Layout = tlCenter
ParentColor = False
end
object BtnInfo: TButton
AnchorSideTop.Control = BtnRunTest
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = BtnRunTest
Left = 460
Height = 25
Top = 0
Width = 75
Anchors = [akTop, akRight]
BorderSpacing.Right = 4
Caption = 'Info'
OnClick = BtnInfoClick
TabOrder = 1
end
end
object Memo: TMemo
Left = 4

View File

@ -40,10 +40,13 @@ type
Panel5: TPanel;
Splitter1: TSplitter;
ImageList1: TImageList;
BtnInfo: TButton;
procedure BtnInfoClick(Sender: TObject);
procedure BtnReadFilesClick(Sender: TObject);
procedure BtnRunTestClick(Sender: TObject);
procedure BtnCreateTxtFilesClick(Sender: TObject);
procedure BtnUncheckAllClick(Sender: TObject);
procedure InfoClick(Sender: TObject);
procedure FileTreeViewClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
@ -177,6 +180,11 @@ begin
end;
end;
procedure TMainForm.InfoClick(Sender: TObject);
begin
Memo.Lines.LoadfromFile('readme.txt');
end;
procedure TMainForm.BtnCreateTxtFilesClick(Sender: TObject);
var
imgDir: String;
@ -213,6 +221,11 @@ begin
end;
end;
procedure TMainForm.BtnInfoClick(Sender: TObject);
begin
Memo.Lines.LoadFromFile('readme.txt');
end;
function TMainForm.CreateRefTags(ANode: TTreeNode; AFileName: String): Boolean;
var
destFile: String;
@ -437,7 +450,7 @@ begin
lTag := imgInfo.ExifData.FindTagByID(tagID);
if lTag = nil then begin
Log(Format('Tag "%s% (ID $%.04x) not found.', [tagName, TTagIDRec(tagID).Tag]));
Log(Format('Tag "%s (ID $%.04x) not found.', [tagName, TTagIDRec(tagID).Tag]));
node := node.GetNextSibling;
continue;
end;

View File

@ -0,0 +1,25 @@
Usage of the test program "multiread"
/0/ Download the program ExifTool from
https://www.sno.phy.queensu.ca/~phil/exiftool/
Unzip the binary and copy it as "exiftool.exe" to the folder "tools" of
the fpexif installation.
/1/ Enter, in the top edit line, the path to the image directory to be analyzed.
/2/ Press "Read files" -- The names of the image files found are listed in the
treeview at the left.
/3/ Uncheck the files to be skipped from the test.
/4/ Press "Create txt files". The program uses ExifTool to extract EXIF metadata
from the checked picture files; the information is stored in text files
bearing the image filename, but extension txt.
/5/ Press "Run test". The program tries to read the EXIF meta data by using
the fpexif routines, compares the results with the exiftool reference
data and lists the differences in the memo.
Some minor differences are possible because both programs may use different
strings in case of enumerated values.

View File

@ -31,9 +31,13 @@
-M
-$M16384,1048576
-K$42200000
-N"D:\Prog_Lazarus\wp-laz\fpexif\tests\readwrite\output\dcu\Delphi7"
-N"output\dcu\Delphi7"
-LE"d:\programme\borland\delphi7\Projects\Bpl"
-LN"d:\programme\borland\delphi7\Projects\Bpl"
-U"common"
-O"common"
-I"common"
-R"common"
-w-UNSAFE_TYPE
-w-UNSAFE_CODE
-w-UNSAFE_CAST

View File

@ -91,10 +91,10 @@ ImageBase=1109393408
ExeDescription=TeeChart 2014 Components
[Directories]
OutputDir=
UnitOutputDir=D:\Prog_Lazarus\wp-laz\fpexif\tests\readwrite\output\dcu\Delphi7
UnitOutputDir=output\dcu\Delphi7
PackageDLLOutputDir=
PackageDCPOutputDir=
SearchPath=
SearchPath=common
Packages=Tee97;TeeUI97;TeeDB97;TeePro97;TeeGL97;TeeImage97;TeeLanguage97;TeeWorld97
Conditionals=
DebugSourceDirs=
@ -135,17 +135,19 @@ ProductName=ReadWriteTest
ProductVersion=1.0.0.0
ProgramID=com.embarcadero.ReadWriteTest
[Excluded Packages]
D:\Prog_Delphi\common\Components\3rdParty\TeeChart\Sources\Compiled\Delphi7\Bin\DclTeeMaker17.bpl=TeeMaker
D:\Prog_Delphi\common\Components\3rdParty\TeeChart\Sources\Compiled\Delphi7\Bin\DclTeeMaker17.bpl=TeeMaker
D:\Programme\Borland\Delphi7\Lib\HelpCtxD7.bpl=HelpScribble HelpContext Property Editor for Delphi 7
[HistoryLists\hlUnitAliases]
Count=1
Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
[HistoryLists\hlSearchPath]
Count=1
Item0=D:\Prog_Lazarus\git\dexif-afriess-master
Count=2
Item0=common
Item1=D:\Prog_Lazarus\git\dexif-afriess-master
[HistoryLists\hlUnitOutputDirectory]
Count=4
Item0=D:\Prog_Lazarus\wp-laz\fpexif\tests\readwrite\output\dcu\Delphi7
Item1=D:\Prog_Lazarus\wp-laz\fpexif\tests\readwrite\output\tpu\Delphi7
Item2=D:\Prog_Lazarus\wp-laz\fpexif\output\tpu\D7
Item3=D:\Prog_Lazarus\wp-laz\fpexif\output\ppu\D7
Count=5
Item0=output\dcu\Delphi7
Item1=D:\Prog_Lazarus\wp-laz\fpexif\tests\readwrite\output\dcu\Delphi7
Item2=D:\Prog_Lazarus\wp-laz\fpexif\tests\readwrite\output\tpu\Delphi7
Item3=D:\Prog_Lazarus\wp-laz\fpexif\output\tpu\D7
Item4=D:\Prog_Lazarus\wp-laz\fpexif\output\ppu\D7

View File

@ -41,7 +41,7 @@
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Base)'!=''">
<DCC_UnitSearchPath>D:\Prog_Lazarus\git\dexif-afriess-master;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
<DCC_UnitSearchPath>..\..;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
<DCC_F>false</DCC_F>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<DCC_E>false</DCC_E>
@ -58,7 +58,7 @@
<VerInfo_Locale>1033</VerInfo_Locale>
<DCC_AssertionsAtRuntime>false</DCC_AssertionsAtRuntime>
<DCC_Description>TeeChart 2014 Components</DCC_Description>
<DCC_DcuOutput>D:\Prog_Lazarus\wp-laz\fpexif\tests\readwrite\output\dcu\Delphi\</DCC_DcuOutput>
<DCC_DcuOutput>output\dcu\Delphi</DCC_DcuOutput>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''">
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>

View File

@ -121,6 +121,11 @@
<Debugging>
<UseExternalDbgSyms Value="True"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
<Debugging>

View File

@ -131,9 +131,12 @@
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir);..\.."/>
<OtherUnitFiles Value="..\..;common"/>
<UnitOutputDirectory Value="output\dcu\$(TargetCPU)-$(TargetOS)"/>
<UnitOutputDirectory Value="output\ppu\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<UseExternalDbgSyms Value="True"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>

View File

@ -50,13 +50,14 @@
<DCC_AssertionsAtRuntime>false</DCC_AssertionsAtRuntime>
<DCC_DebugInformation>1</DCC_DebugInformation>
<DCC_Description>TeeChart 2014 Components</DCC_Description>
<DCC_UnitSearchPath>D:\Prog_Lazarus\wp-laz\fpexif;D:\Prog_Lazarus\wp-laz\fpexif\tests\unittest\common;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
<DCC_UnitSearchPath>common;..\..;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
<DCC_UsePackage>Tee97;TeeUI97;TeeDB97;TeePro97;TeeGL97;TeeImage97;TeeLanguage97;TeeWorld97;$(DCC_UsePackage)</DCC_UsePackage>
<SanitizedProjectName>fpExifTests_Delphi</SanitizedProjectName>
<DCC_Namespace>Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace)</DCC_Namespace>
<VerInfo_MajorVer>0</VerInfo_MajorVer>
<VerInfo_Locale>1033</VerInfo_Locale>
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=0.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=</VerInfo_Keys>
<DCC_DcuOutput>output\dcu\Delphi</DCC_DcuOutput>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''">
<DCC_Namespace>System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
@ -90,6 +91,7 @@
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_MajorVer>1</VerInfo_MajorVer>
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName)</VerInfo_Keys>
<Icon_MainIcon>$(BDS)\bin\delphi_PROJECTICON.ico</Icon_MainIcon>
</PropertyGroup>
<ItemGroup>
<DelphiCompile Include="$(MainSource)">

View File

@ -31,12 +31,13 @@
-M
-$M16384,1048576
-K$42200000
-N"output\dcu\Delphi7"
-LE"d:\programme\borland\delphi7\Projects\Bpl"
-LN"d:\programme\borland\delphi7\Projects\Bpl"
-U"D:\Prog_Lazarus\wp-laz\fpexif;D:\Prog_Lazarus\wp-laz\fpexif\tests\unittest\common;D:\Prog_Lazarus\wp-laz\fpexif\tests\unittest\dunit"
-O"D:\Prog_Lazarus\wp-laz\fpexif;D:\Prog_Lazarus\wp-laz\fpexif\tests\unittest\common;D:\Prog_Lazarus\wp-laz\fpexif\tests\unittest\dunit"
-I"D:\Prog_Lazarus\wp-laz\fpexif;D:\Prog_Lazarus\wp-laz\fpexif\tests\unittest\common;D:\Prog_Lazarus\wp-laz\fpexif\tests\unittest\dunit"
-R"D:\Prog_Lazarus\wp-laz\fpexif;D:\Prog_Lazarus\wp-laz\fpexif\tests\unittest\common;D:\Prog_Lazarus\wp-laz\fpexif\tests\unittest\dunit"
-U"dunit;..\..;common"
-O"dunit;..\..;common"
-I"dunit;..\..;common"
-R"dunit;..\..;common"
-w-UNSAFE_TYPE
-w-UNSAFE_CODE
-w-UNSAFE_CAST

View File

@ -91,10 +91,10 @@ ImageBase=1109393408
ExeDescription=TeeChart 2014 Components
[Directories]
OutputDir=
UnitOutputDir=
UnitOutputDir=output\dcu\Delphi7
PackageDLLOutputDir=
PackageDCPOutputDir=
SearchPath=D:\Prog_Lazarus\wp-laz\fpexif;D:\Prog_Lazarus\wp-laz\fpexif\tests\unittest\common;D:\Prog_Lazarus\wp-laz\fpexif\tests\unittest\dunit
SearchPath=dunit;..\..;common
Packages=Tee97;TeeUI97;TeeDB97;TeePro97;TeeGL97;TeeImage97;TeeLanguage97;TeeWorld97
Conditionals=
DebugSourceDirs=
@ -134,12 +134,18 @@ OriginalFilename=
ProductName=
ProductVersion=
[Excluded Packages]
D:\Prog_Delphi\common\Components\3rdParty\TeeChart\Sources\Compiled\Delphi7\Bin\DclTeeMaker17.bpl=TeeMaker
D:\Prog_Delphi\common\Components\3rdParty\TeeChart\Sources\Compiled\Delphi7\Bin\DclTeeMaker17.bpl=TeeMaker
D:\Programme\Borland\Delphi7\Lib\HelpCtxD7.bpl=HelpScribble HelpContext Property Editor for Delphi 7
[HistoryLists\hlUnitAliases]
Count=1
Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
[HistoryLists\hlSearchPath]
Count=2
Item0=D:\Prog_Lazarus\wp-laz\fpexif;D:\Prog_Lazarus\wp-laz\fpexif\tests\unittest\common;D:\Prog_Lazarus\wp-laz\fpexif\tests\unittest\dunit
Item1=D:\Prog_Lazarus\wp-laz\fpexif;D:\Prog_Lazarus\wp-laz\fpexif\tests\unittest\common
Count=5
Item0=dunit;..\..;common
Item1=dunit;..\..
Item2=dunit
Item3=D:\Prog_Lazarus\wp-laz\fpexif;D:\Prog_Lazarus\wp-laz\fpexif\tests\unittest\common;D:\Prog_Lazarus\wp-laz\fpexif\tests\unittest\dunit
Item4=D:\Prog_Lazarus\wp-laz\fpexif;D:\Prog_Lazarus\wp-laz\fpexif\tests\unittest\common
[HistoryLists\hlUnitOutputDirectory]
Count=1
Item0=output\dcu\Delphi7

View File

@ -1,2 +1,5 @@
Place the program exiftool.exe into this directory, it is needed by the
test program "multiread".
test program "multiread".
ExifTool can be downloaded from https://www.sno.phy.queensu.ca/~phil/exiftool/.
The binary must be renamed to "exiftool.exe".