C из Clarion 5.5 for W

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Реляво О.Е.
Прохожий
Сообщения: 1
Зарегистрирован: 14 Март 2010, 13:42

C из Clarion 5.5 for W

Сообщение Реляво О.Е. »

Уважаемые господа! Давно не брал я в руки шашек, мне уже под полтнник. Прошу помочь в одном вопросе: хочу вызвать функцию написаннаю на C из Clarion 5.5 for W.Раньше это делал, сейчас нужен толковый совет. Зранее благодарю. мой mail - realrelyawo@mail.ru.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Re: C из Clarion 5.5 for W

Сообщение Дед Пахом »

Если функция сидит в dll, надо сделать на её основе lib-файл с помощью libmaker.exe (входит в поставку), в том же libmaker посмотреть её прототип и объявить в глобальной секции MAP. Lib-файл включить в проект.
С уважением, ДП
Аватара пользователя
WadimZapara
Активист
Сообщения: 181
Зарегистрирован: 11 Июнь 2008, 12:11
Откуда: Тамбов

Re: C из Clarion 5.5 for W

Сообщение 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)
Компьютер имеет то преимущество перед мозгом, что им пользуются...
Ответить