C 在Delphi应用程序中使用hdf5dll

C 在Delphi应用程序中使用hdf5dll,c,delphi,dll,hdf5,C,Delphi,Dll,Hdf5,我想在Delphi 10.2 Windows 10 64位应用程序中使用HDF5() 我将hdf5.dll(用C编写)与以下声明一起使用: const H5P_默认值:整数=0; H5F_ACC_RDONLY:整数=$0000//*缺少rdwr=>仅限rd*/ H5F_ACC_RDWR:整数=0001美元//*开放读写*/ H5F_ACC_TRUNC:整数=0002美元//*覆盖现有文件*/ H5F_ACC_不包括:整数=0004美元//*如果文件已存在,则失败*/ H5F_ACC_DEBUG:

我想在Delphi 10.2 Windows 10 64位应用程序中使用HDF5()

我将hdf5.dll(用C编写)与以下声明一起使用:

const
H5P_默认值:整数=0;
H5F_ACC_RDONLY:整数=$0000//*缺少rdwr=>仅限rd*/
H5F_ACC_RDWR:整数=0001美元//*开放读写*/
H5F_ACC_TRUNC:整数=0002美元//*覆盖现有文件*/
H5F_ACC_不包括:整数=0004美元//*如果文件已存在,则失败*/
H5F_ACC_DEBUG:Integer=$0008//*打印调试信息*/
H5F_ACC_create:Integer=$0010//*创建不存在的文件*/
类型
hid_t=整数;
hsize_t=UINT64;
hssize_t=INT64;
大小t=基数;
herr_t=整数;
无符号=基数;
H5_ih_信息=记录
索引大小:hsize\u t;
堆大小:hsize\u t;
结束;
t欧姆=记录
hdr_大小:hsize_t;
msgs_信息:H5_ih_信息;
结束;
TH5F_info_t=记录
超外型尺寸:西泽t;
sohm:Tsohm;
结束;
PH5F_信息=^TH5F_信息;
//初始化HDF5库
功能H5打开:herr\u t;cdecl;外部“hdf5.dll”;
//将所有数据刷新到磁盘,关闭所有打开的HDF5对象,并清理HDF5库使用的所有内存
功能H5关闭:herr\u t;cdecl;外部“hdf5.dll”;
//检索HDF5库版本的主要版本号、次要版本号和发行版本号
函数H5get_libversion(var majnum:unsigned;var minnum:unsigned;var relnum:unsigned):herr\t;cdecl;外部“hdf5.dll”;
//打开现有的HDF5文件。
函数H5Fopen(文件名:PAnsiChar;标志:unsigned;fapl\u id:hid\u t):hid\u t;cdecl;外部“hdf5.dll”;
//终止对HDF5文件的访问。
函数H5Fclose(文件id:hid):herr\t;cdecl;外部“hdf5.dll”;
//返回文件的全局信息
函数H5Fget_信息2(对象id:hid;文件信息:PH5F_信息):herr_t;cdecl;外部“hdf5.dll”;
//创建一个新的简单数据空间并将其打开以供访问。
函数H5Screate_simple(秩:整数;当前维数:指针;最大维数:指针):hid\t;cdecl;外部“hdf5.dll”;
//创建新组并将其链接到文件中。
函数H5Gcreate2(loc_id:hid_t;aname:PAnsiChar;lcpl_id:hid_t;gcpl_id:hid_t;gapl_id:hid_t):hid_t;cdecl;外部“hdf5.dll”;
下面的代码

procedure TForm1.按钮1点击(发送方:TObject);
变量
地位:主席;
majnum、minnum、relnum:未签名;
文件id:hid\u t;
组id:hid\u t;
数据空间id:hid\u t;
数据集\u id:hid\u t;
dims:hsize_t的数组[0..1];
文件信息:TH5F信息;
文件信息:PH5F\u信息;
开始
状态:=H5open;
备忘录1.行。添加('H5open'+IntToStr(状态))//状态=0->OK
状态:=H5get_libversion(majnum、minnum、relnum);
备忘录1.行。添加('H5get_libversion'+IntToStr(状态))//状态=0->OK
备忘录1.行。添加(IntToStr(majnum))//majnum=1
备忘录1.行。添加(IntToStr(minnum))//minnum=10
备忘录1.行。添加(IntToStr(relnum))//relnum=6
//->版本1.10.6。
文件id:=H5Fopen('example.h5',H5F_ACC_RDWR,H5P_默认值);
备忘录1.Lines.Add('H5Fopen'+IntToStr(文件id))//文件id=0->
pfile_info:=@file_info;
状态:=H5Fget_信息2(0,pfile_信息);
备忘录1.行。添加('H5Fget_info2'+IntToStr(状态))//状态=-1->错误
组id:=H5Gcreate2(文件id,'testgroup',H5P_默认值,H5P_默认值,H5P_默认值);
备忘录1.行。添加('H5Gcreate2'+IntToStr(组id))//组id=-1->错误
dims[0]:=4;
dims[1]:=6;
dataspace_id:=H5Screate_simple(2,@dims,nil);
备忘录1.Lines.Add('H5Screate_simple'+IntToStr(dataspace_id))//数据空间_id=2->OK
状态:=H5Fclose(文件id);
备忘录1.行。添加('H5Fclose'+IntToStr(状态))//状态=-1->错误
状态:=关闭;
备忘录1.行。添加('H5close'+IntToStr(状态))//状态=0->OK
结束;
给出这个输出

H5open 0
H5get_libversion 0
1
10
6
H5Fopen 0
H5Fget_info2 -1
H5Gcreate2 -1
H5Screate_simple 2
H5Fclose -1
H5close 0
H5Fopen似乎可以工作,但所有使用文件_id的函数随后都返回-1,这意味着发生了错误


有什么问题吗?

戴夫·诺塔吉的评论就是答案。类型不正确

如果看不到更多的代码,我们就无法知道出了什么问题。例如,我们看不到任何类型声明。制作一个最小的C示例来实现这一点。然后在Delphi中生成相同的代码。然后找到第一个不同的函数调用。然后dig deeperI添加了类型声明。不幸的是,我几乎不懂C,也没有太多在Delphi中使用外部DLL的经验。所以我真的没有计划如何调试这个。如果你能给我更多的提示,我会很高兴。我的建议是学习足够的C语言来编写一个调用DLL的简单程序,并且能够准确地翻译头文件。人们期望在这样的任务中取得成功,却不花时间学习所需的技能,这让我感到惊讶不已。当我第一次需要做这样的任务时,我就是这么做的。你对H5FGetInfo2的声明是错误的。在C声明中,file_info是指向H5F_info2_t的指针。请点击此处:查看H5F_info2_t的声明。您可能有其他不正确的声明,因此也请检查这些声明