Дед Пахом писал(а):Если функция сидит в 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)