C из Clarion 5.5 for W
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию 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
либо альтернатива:Дед Пахом писал(а):Если функция сидит в 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)
Компьютер имеет то преимущество перед мозгом, что им пользуются...