use HDF5 dll in Delphi application


#1

I would like to work with HDF5 in my Delphi 10.2 Windows 10 64bit application.

I use hdf5.dll with the following declarations:

//initializes the HDF5 library
function H5open: herr_t; cdecl; external ‘hdf5.dll’;

//flushes all data to disk, closes all open HDF5 objects, and cleans up all memory used by the HDF5 library
function H5close: herr_t; cdecl; external ‘hdf5.dll’;

//retrieves the major, minor, and release numbers of the version of the HDF5 library
function H5get_libversion( var majnum: unsigned; var minnum: unsigned; var relnum:unsigned): herr_t; cdecl; external ‘hdf5.dll’;

// Opens an existing HDF5 file.
function H5Fopen(filename: PAnsiChar; flags: unsigned; fapl_id: hid_t): hid_t; cdecl; external ‘hdf5.dll’;

//Terminates access to an HDF5 file.
function H5Fclose(file_id: hid_t): herr_t; cdecl; external ‘hdf5.dll’;

//Returns global information for a file
function H5Fget_info2(obj_id: hid_t; file_info: PH5F_info_t): herr_t; cdecl; external ‘hdf5.dll’;

//Creates a new simple dataspace and opens it for access.
function H5Screate_simple(rank: Integer; current_dims: Pointer; maximum_dims: Pointer): hid_t; cdecl; external ‘hdf5.dll’;

//Creates a new group and links it into the file.
function H5Gcreate2(loc_id: hid_t; aname: PAnsiChar; lcpl_id: hid_t; gcpl_id: hid_t; gapl_id: hid_t): hid_t; cdecl; external ‘hdf5.dll’;

The following code

procedure TForm1.Button1Click(Sender: TObject);
var
status: herr_t;
majnum, minnum, relnum: unsigned;
file_id: hid_t;
group_id: hid_t;
dataspace_id: hid_t;
dataset_id: hid_t;
dims: array[0…1] of hsize_t;
file_info: TH5F_info_t;
pfile_info: PH5F_info_t;
begin
status := H5open;
Memo1.Lines.Add('H5open ’ + IntToStr(status)); //status=0 -> OK

status := H5get_libversion(majnum, minnum, relnum);
Memo1.Lines.Add('H5get_libversion ’ + IntToStr(status)); //status=0 -> OK
Memo1.Lines.Add(IntToStr(majnum)); //majnum=1
Memo1.Lines.Add(IntToStr(minnum)); //minnum=10
Memo1.Lines.Add(IntToStr(relnum)); //relnum=6
//-> version 1.10.6.

file_id := H5Fopen(‘example.h5’, H5F_ACC_RDWR, H5P_DEFAULT);
Memo1.Lines.Add('H5Fopen ’ + IntToStr(file_id)); //file_id=0 -> OK

pfile_info:=@file_info;
status:=H5Fget_info2(0, pfile_info);
Memo1.Lines.Add('H5Fget_info2 ’ + IntToStr(status)); //status=-1 -> ERROR

group_id:=H5Gcreate2(file_id, ‘testgroup’, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
Memo1.Lines.Add('H5Gcreate2 ’ + IntToStr(group_id)); //group_id=-1 -> ERROR

dims[0]:=4;
dims[1]:=6;

dataspace_id := H5Screate_simple(2, @dims, nil);
Memo1.Lines.Add('H5Screate_simple ’ + IntToStr(dataspace_id)); //dataspace_id=2 -> OK

status:=H5Fclose(file_id);
Memo1.Lines.Add('H5Fclose ’ + IntToStr(status)); //status=-1 -> ERROR

status:=H5close;
Memo1.Lines.Add('H5close ’ + IntToStr(status)); //status=0 -> OK
end;

gives this output

H5open 0
H5get_libversion 0
1
10
6
H5Fopen 0
H5Fget_info2 -1
H5Gcreate2 -1
H5Screate_simple 2
H5Fclose -1
H5close 0

H5Fopen seems to work but all functions which uses the file_id afterwards return -1 meaning that an error occurred.

What could be the problem?

Thank you!


#2

Are you sure that PH5F_info_t resolves to H5F_info2_t?

Can you pass file_id instead of 0 to H5Fget_info2? (Are you confident that 0 gets cast to a 64-bit integer?)

The fact that H5Gcreate2 fails suggests that there is more going on here. (?)

G.


#3

You are right. The types have been incorrect. Now it works. Thank you very much.