Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы программирования на FORTRAN (ФОРТРАН)

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

aur1

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

! Delphi prototype
! Function wspSPT(const p: Double; const t: Double): Double; stdcall; external 'okawsp6.dll';
 
program hello
 
   USE ISO_C_BINDING
 
   INTERFACE
      FUNCTION LoadLibrary(lpFileName) BIND(C, NAME='LoadLibraryA')
         USE ISO_C_BINDING
         CHARACTER(KIND=C_CHAR) :: lpFileName(*)
         !GCC$ ATTRIBUTES STDCALL :: LoadLibrary
         INTEGER(C_INTPTR_T) :: LoadLibrary
      END FUNCTION LoadLibrary
 
      FUNCTION GetProcAddress(hModule, lpProcName)  &
            & BIND(C, NAME='GetProcAddress')
         USE ISO_C_BINDING
         !GCC$ ATTRIBUTES STDCALL :: GetProcAddress
         TYPE(C_FUNPTR) :: GetProcAddress
         INTEGER(C_INTPTR_T), VALUE :: hModule
         CHARACTER(KIND=C_CHAR) :: lpProcName(*)
      END FUNCTION GetProcAddress
 
      FUNCTION FreeLibrary(hModule) BIND(C, NAME='FreeLibrary')
         USE ISO_C_BINDING
         !GCC$ ATTRIBUTES STDCALL :: FreeLibrary
         LOGICAL(C_BOOL) :: FreeLibrary
         INTEGER(C_INTPTR_T), VALUE :: hModule
      END FUNCTION FreeLibrary
   END INTERFACE
 
INTERFACE
     FUNCTION wspSPT(p, t) BIND(C, NAME='wspSPT')
         USE ISO_C_BINDING
         !GCC$ ATTRIBUTES STDCALL :: wspSPT
         real(C_DOUBLE) :: wspSPT
         real(C_DOUBLE), VALUE :: p
         real(C_DOUBLE), VALUE :: t
      END FUNCTION wspSPT
END INTERFACE
 
   integer(C_INTPTR_T) :: hdll
   integer(C_INTPTR_T) :: module_handle
 
  ! Для теста - получим указатель на FreeLibrary из библиотеки kernel32.dll
   TYPE(C_FUNPTR) :: paddr
   PROCEDURE(FreeLibrary), BIND(C), POINTER :: pproc
   hdll = LoadLibrary(C_CHAR_'kernel32.dll' // C_NULL_CHAR)
   print *, 'hdll=', hdll
 
  module_handle = LoadLibrary( Trim(Adjustl('OKAWSP6.DLL')) // char(0) )
!  module_handle = LoadLibraryEx('OKAWSP6.DLL', 0, INT('8'X,KIND=C_INT32_T))
   print *, 'module_handle=', module_handle
!Выводит module_handle=0
!
   paddr = GetProcAddress(hdll, C_CHAR_'FreeLibrary' // C_NULL_CHAR)
   if(.not. C_ASSOCIATED(paddr)) &
      & error stop 'Unable to obtain procedure address'
   print *, 'paddr=', paddr
 
   CALL C_F_PROCPOINTER(paddr, pproc)
 
   print *, 'Result FreeLibrary(hdll)=', pproc(hdll), 'expect .true.'
   print *, 'Result FreeLibrary(1)=', pproc(1_C_INTPTR_T) , 'expect .false'
 
 ! test
 ! print *, wspSPT(2500000.0d0,410.1d0)
  stop 'stop'
 
end program
 

Всего записей: 56 | Зарегистр. 28-08-2007 | Отправлено: 09:19 12-04-2021 | Исправлено: aur1, 09:36 12-04-2021
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы программирования на FORTRAN (ФОРТРАН)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru