I am trying to use an Aonix ADA DLL with CVF on Win2k.
The ADA code goes something like this . . .
package Att_Auto_Inc_Pkg is
Att_Mode : Integer;
Ap_Mode : Integer;
Adjust_Fac : Float := 0.0;
pragma Export (DLL,Adjust_Fac,"Adjust_Fac_ADA");
pragma Export (DLL,Init_Att_Done,"Init_Att_Done_ADA");
pragma Export (DLL,Init_Auto_Done,"Init_Auto_Done_ADA");
end Att_Auto_Inc_Pkg;
package Control_Flight_Pkg is
procedure Att;
procedure Auto;
procedure Initialize_Att;
procedure Initialize_Auto;
pragma Export(DLL,Att,"att_ada");
pragma Export(DLL,Auto,"auto_ada");
pragma Export(DLL,Initialize_Att,"initialize_att_ada");
pragma Export(DLL,Initialize_Auto,"initialize_auto_ada");
end Control_Flight_Pkg;
with Control_Flight_Pkg;
with Att_Auto_Inc_Pkg;
procedure DLL is
begin
null;
end;
The following C code can access both the functions and data elements. . .
#include <stdio.h>
extern __declspec(dllimport) void Initialize_Att();
extern __declspec(dllimport) void Initialize_Auto();
extern __declspec(dllimport) void Att();
extern __declspec(dllimport) void Auto();
extern __declspec(dllimport) float Adjust_Fac_ADA;
extern __declspec(dllimport) int Init_Att_Done_ADA;
extern __declspec(dllimport) int Init_Auto_Done_ADA;
#include <stdio.h>
void main()
{
float Adjust_Fac = 0;
int Ap_Mode = 0;
int Att_Mode = 0;
Initialize_Att();
Initialize_Auto();
Att();
Auto();
Adjust_Fac = Adjust_Fac_ADA;
Init_Att_Done = Init_Att_Done_ADA;
Init_Auto_Done = Init_Auto_Done_ADA;
printf("Adjust_Fac = %f\n",Adjust_Fac);
printf("Init_Att_Done = %d\n",Init_Att_Done);
printf("Init_Auto_Done = %d\n",Init_Auto_Done);
}
The following FORTRAN code can access the functions, but I can't seem to get
the attributes statement correct for the data elements
PROGRAM main
IMPLICIT NONE
INTERFACE
SUBROUTINE Auto_ADA
!DEC$ATTRIBUTES C :: Auto_ADA
!DEC$ATTRIBUTES DLLIMPORT :: Auto_ADA
END SUBROUTINE auto_ada
END INTERFACE
INTERFACE
SUBROUTINE Initialize_Auto_ADA
!DEC$ATTRIBUTES C :: Initialize_Auto_ADA
!DEC$ATTRIBUTES DLLIMPORT :: Initialize_Auto_ADA
END SUBROUTINE Initialize_Auto_ADA
END INTERFACE
INTERFACE
SUBROUTINE Att_ADA
!DEC$ATTRIBUTES C :: Att_ADA
!DEC$ATTRIBUTES DLLIMPORT :: Att_ADA
END SUBROUTINE Att_ada
END INTERFACE
INTERFACE
SUBROUTINE Initialize_Att_ADA
!DEC$ATTRIBUTES C :: Initialize_Att_ADA
!DEC$ATTRIBUTES DLLIMPORT :: Initialize_Att_ADA
END SUBROUTINE Initialize_Att_ADA
END INTERFACE
!DEC$ATTRIBUTES EXTERN :: Init_Att_Done_ADA
!DEC$ATTRIBUTES DLLIMPORT :: Init_Att_Done_ADA
INTEGER i
i = Init_Att_Done_ADA
write(*,*) i
call Initialize_Att_ADA
i = Init_Att_Done_ADA
write(*,*) i
call Initialize_Auto_ADA
call Att_ADA
call Auto_ADA
END
I assume this is just a matter of casting the right attributes spell. Any
help would be greatly appreciated.
Thanks,
Neill S. Smith
www.vctinc.com
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|