Страница 1 из 1

C из Clarion 5.5 for W

Добавлено: 14 Март 2010, 14:13
Реляво О.Е.
Уважаемые господа! Давно не брал я в руки шашек, мне уже под полтнник. Прошу помочь в одном вопросе: хочу вызвать функцию написаннаю на C из Clarion 5.5 for W.Раньше это делал, сейчас нужен толковый совет. Зранее благодарю. мой mail - realrelyawo@mail.ru.

Re: C из Clarion 5.5 for W

Добавлено: 14 Март 2010, 16:57
Дед Пахом
Если функция сидит в dll, надо сделать на её основе lib-файл с помощью libmaker.exe (входит в поставку), в том же libmaker посмотреть её прототип и объявить в глобальной секции MAP. Lib-файл включить в проект.

Re: C из Clarion 5.5 for W

Добавлено: 16 Март 2010, 19:00
WadimZapara
Дед Пахом писал(а):Если функция сидит в dll, надо сделать на её основе lib-файл с помощью libmaker.exe (входит в поставку), в том же libmaker посмотреть её прототип и объявить в глобальной секции MAP. Lib-файл включить в проект.
либо альтернатива:
1) объявление прототипа функции в секции MAP в соответствии с синтаксисом клариона, с добавлением атрибутов C,NAME('MY_NAME')
2) объявление глобальной переменной (пусть MY_ADDR) типа LONG или ULONG с добавлением атрибутов STATIC,NAME('MY_NAME')
3) виндовозная загрузка DLL-библиотеки (с пом. LoadLibrary(...))
4) настройка адреса функции (MY_ADDR = GetProcAddress(...))
5) вызов функции согласно описанному прототипу
6) при отсутствии дальнейшей необходимости работы с библиотекой - её выгрузка (с пом. FreeLibrary)

примечание: если функция всё-таки не C, а PASCAL, что бывает чаще в винде - то вместо атрибута C нужны: PASCAL,RAW.
Этот способ чуть посложнее чем предложил ДП, но позволяет программе работать в среде, где нет нужной DLL, она может просто не выполнять этой функции, или членораздельно сказать, чё-почём.
ПРИМЕР ДЛЯ ЯСНОСТИ: БЛОКИРОВКА РАБОЧЕЙ СТАНЦИИ ПОД ОС Win:NT/2k/2k3/XP, под Win98 - сообщение о неудаче

Код: Выделить всё

  PROGRAM

  MAP
    Module('Windows.dll')
      LoadLibrary(*CString NameLibrary),UnSigned,RAW,PASCAL,DLL(TRUE),Name('LoadLibraryA')
      FreeLibrary(UnSigned handle),BOOL,PASCAL,DLL(TRUE)
      GetProcAddress(UnSigned handle, *CString NameFunction),ULong,Raw,PASCAL,DLL(TRUE)
      GetLastError(),Long,PASCAL,DLL(TRUE)
      SetLastError(Long),PASCAL,DLL(TRUE)
    End
    Module('')
     ! Эта функция присутствует только в User32.dll в ОС: WinNT/Win2000/Win2003/WinXP, в Win98 её нет.
     LockWorkStationMe(),BOOL,RAW,PASCAL,DLL(TRUE),Name('LockWorkStationMe'),Proc
    End
    LockWorkStation(),Signed
  END

AddrLockWorkStation  ULONG,Static,Name('LockWorkStationMe')

  CODE

  If ~LockWorkStation() Then
    Message('Блокировка рабочей станции не получилась, код ошибки: '& GetLastError())
    ! Это сообщение будет под Windows-98
  Else
    ! Рабочая станция заблокирована.
  End


!**********************************************************************************
LockWorkStation  FUNCTION() !,Signed
err             Long(0)
ret             Signed(FALSE)
hLib_User32     UnSigned,Auto   ! Handle библиотеки User32.dll
Cs              CString(256)
!**********************************************************************************
  Code
    Cs = 'User32.dll'   ! или полный маршрут...
    hLib_User32 = LoadLibrary(Cs)
    if hLib_User32 then ! библиотека загружена
      Cs = 'LockWorkStation'
      AddrLockWorkStation = GetProcAddress(hLib_User32, Cs)
      if AddrLockWorkStation then  ! получен адрес функции
        ret = LockWorkStationMe()
      else
        err = GetLastError()
      end
      FreeLibrary(hLib_User32)
      if ~ret Then SetLastError(err).
    end !if hLib_User32
  Return(ret)