BEST logo логотип компании БЭСТ - программы для бизнеса ПРОДАЖИ
+7 (991) 312-04-37
trade@bestnet.ru
ПОДДЕРЖКА
+7 (495) 775-66-76
consult@bestnet.ru
СКАЧАТЬ
Обновления
Дистрибутивы
Авторизация

Логин:
Пароль:
Забыли свой пароль?
Регистрация
ВАШ ВОПРОС

Доступ к Личному кабинету закрыт!
Как получить доступ?


Главная  / Поддержка  / Форум  / Публичные форумы  / Программирование приложений  / SetTimer возможность создания таймера?

Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
SetTimer возможность создания таймера?
 
Существует ли возможность работы с таймерами при разработке плагинов для Б5?
 
ВИндовый SetTimer вызвать можно.
Но вот как определять нужные события, увязать это к окну - боюсь не получится
Даже дельфя свой таймер делали, а БЭСТ далеко не дельфя
МОжет зная задачу что-то другое можно посоветовать ?
 
Вот такой примерчик состряпал.
Можете с отладчиком его покрутить и посмотреть что возвращают в xRet



Код
     Local pDll,xRet
     ALTD()

     pDll:=LoadLibrary("C:\windows\system32\user32.dll")
     xRet:= DLLCALL(pDll,32,"SetTimer",3,0,0,0,0)
     xRet:= DLLCALL(pDll , 32,"KillTimer",8,0,0)
     FREELibrary(pDll)
RETURN NILL
 
Таймер нужен для периодического опроса внешней реляционной базы данных на время работы плагина для Б5.

В Harbour таймер присутствует, но его с Б5 не подружить :)

Дико извиняюсь за свою не компетентность, но описание вызова DLLCALL в xHarbour Language Reference Guide отличается от Б5.

Если Вам не трудно переведите следующую процедуру к синтаксису Б5:

#include "hbdll.ch"

ALTD()

fnTestDll()

PROCEDURE fnTestDll()

LOCAL cFile := "d:\proba.ini"
LOCAL hDll := DllLoad("shell32.dll")
LOCAL pFunc, xRet

IF !File( cFile )

MessageBox("File name must be specified")
QUIT
ENDIF


IF Empty(hDll)

MessageBox("Dll name must be specified")
QUIT
ENDIF

xRet := DllCall( hDll, DLL_STDCALL, "ShellExecute", "open", cFile, NIL, NIL, 1 )

DllUnload( hDll )
RETURN
 
как загружать и выгружать библиотеку я писал выше

Код
pDll:=LoadLibrary("C:\windows\system32\shell32.dll")

Код
DLLCALL([адрес библиотеки],32,[имя функции].[тип возвращаемого значения],[параметры,])


Код
FREELibrary(pDll)  

DLL_STDCALL, - 32
все номера возвращаемых типов не помню, напишу как буду в офисе
И даже здесь не все однозначно, зависит от языка сборки - отсюда следует четко понимать что не все long для харбора long
В частности settimer по классике long но мои программисты Си рекомендовали ставить INT (3)
 
мне на самом деле не так интересно как пишут в харборе больше нужно было ссылку на описание функции в msdn из shell32, чтобы посмотреть какого типа она возвращает значение
 
~ все номера возвращаемых типов не помню, напишу как буду в офисе
В этом нет необходимости, это есть в hbdll.ch (папка include Б5).

Вот эта часть примера: DllCall( hDll, DLL_STDCALL, "ShellExecute", "open", cFile, NIL, NIL, 1 )
взята из xHarbour Language Reference Guide.
При работе плагина в этом месте выдаётся ошибка.
Хотя загрузка библиотеки происходит штатно, это видно в отладчике.

А вот так: DLLCALL([адрес библиотеки],32,[имя функции].[тип возвращаемого значения],[параметры,])
описание этой функции выглядит в hbdll.ch (папка include Б5)

По описанию функции в Б5, тип возвращаемого значения нужно указывать всегда.

А для работы с таймером понадобится библиотечка обёртка с параметрами : [интервал, @процедура]

- И для меня вопрос, возможно ли из xHarbour передать ссылку на процедуру: DllCall( hDll, DLL_STDCALL, "MyProcedure", 0, 1000, @fnProcB5)
Изменено: Андрей Зиганьшин - 18.06.2015 16:28:27
 
Вообще весь БЭСт построен на обертках.
У вас в руках тот же инструмент, что и у разработчика.
Вы библиотеку только прилинковать в момент компиляции не можете.
Образцы кода с передачей ссылок я в исходниках БЭСта встречал - значит этим пользуются или пользовались
Вот они

Код
    DllCall(BadiHandle, DLL_STDCALL, 'GetCurrentDataBaseType', @r, @l)


Код
   DllCall(BadiHandle, DLL_XPPCALL, 'GetTemporaryFileName', @r, @l)
Они закрыты ремарками и судя по формату тут нет типа возвращаемого значения
Но я уверен что если преобразовать к новому стандарту - они бы заработали
разработчик просто перешел на прилинкованные библиотеки (я так думаю)






Надо пробовать - я никогда не делал
Тут только надо четко определиться какой будет формат вызова
DLL_STDCALL - не факт
 
Огромное спасибо
 
Если что-то получилось и можете поделиться - положите сюда пожалуйста.
Меня неоднократно спрашивали как работать с dll сторонними - все руки не доходили
А на форуме - полезно
Страницы: 1
Читают тему (гостей: 1)