Как составить описание функции SetFilePointerEx

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Алексей- Софт-Центр
Ветеран
Сообщения: 390
Зарегистрирован: 26 Август 2009, 12:41
Откуда: Moscow
Контактная информация:

Как составить описание функции SetFilePointerEx

Сообщение Алексей- Софт-Центр »

Добрый день!
Как описать api функцию:
BOOL SetFilePointerEx(
HANDLE hFile,
LARGE_INTEGER liDistanceToMove,
PLARGE_INTEGER lpNewFilePointer,
DWORD dwMoveMethod
);

SetFilePointerEx(UNSIGNED,?,?,ULONG),BOOL,PASCAL,RAW,NAME('SetFilePointerEx')

А вот как определить LARGE_INTEGER и PLARGE_INTEGER ?

Алексей
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Как составить описание функции SetFilePointerEx

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

Как-то так, параметр liDistanceToMove передаём двумя LONG, параметр lpNewFilePointer это адрес:

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

SetFilePointerEx(UNSIGNED,LONG lowLongDistanceToMove,LONG hiLongDistanceToMove,LONG pNewFilePointer,ULONG),BOOL,PASCAL,RAW,NAME('SetFilePointerEx')
С уважением, ДП
Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

Как составить описание функции SetFilePointerEx

Сообщение Constantine »

Алексей- Софт-Центр писал(а): 17 Июль 2019, 12:06LARGE_INTEGER liDistanceToMove
У меня прокатывал такой вариант:

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

liDistanceToMove REAL
STR STRING(8),OVER(liDistanceToMove)
А в STR пишем побайтно... Паскалевское соглашение о связях такие пассажи пропускает... :-)
Алексей- Софт-Центр
Ветеран
Сообщения: 390
Зарегистрирован: 26 Август 2009, 12:41
Откуда: Moscow
Контактная информация:

Как составить описание функции SetFilePointerEx

Сообщение Алексей- Софт-Центр »

Спасибо, сейчас попробую!

Алексей
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Как составить описание функции SetFilePointerEx

Сообщение kreator »

В equates.clw есть группа int64. Скорее всего, то, что надо.
We are hard at work… for you. :)
Аватара пользователя
vic7tar
Ветеран
Сообщения: 365
Зарегистрирован: 09 Февраль 2017, 20:12

Как составить описание функции SetFilePointerEx

Сообщение vic7tar »

Дед Пахом писал(а): 17 Июль 2019, 12:19Как-то так, параметр liDistanceToMove передаём двумя LONG, параметр lpNewFilePointer это адрес:

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

SetFilePointerEx(UNSIGNED,LONG lowLongDistanceToMove,LONG hiLongDistanceToMove,LONG pNewFilePointer,ULONG),BOOL,PASCAL,RAW,NAME('SetFilePointerEx')
... , ulong lowLongDistanceToMove, ... - наверно так нужно писать?
C10, Win10x64
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Как составить описание функции SetFilePointerEx

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

vic7tar писал(а): 17 Июль 2019, 17:44... , ulong lowLongDistanceToMove, ... - наверно так нужно писать?
не принципиально, но по смыслу да, ulong логичнее.
С уважением, ДП
Аватара пользователя
vic7tar
Ветеран
Сообщения: 365
Зарегистрирован: 09 Февраль 2017, 20:12

Как составить описание функции SetFilePointerEx

Сообщение vic7tar »

Нет, тут не должно быть логики, вот определение:

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

...
typedef union _LARGE_INTEGER {
    struct {
        DWORD LowPart;  <-----------------------------------------------------
        LONG HighPart;
    } DUMMYSTRUCTNAME;
    struct {
        DWORD LowPart;
        LONG HighPart;
    } u;
#endif //MIDL_PASS
    LONGLONG QuadPart;
} LARGE_INTEGER;
Вопрос к стартеру - если не секрет, для чего нужна эта функция?
C10, Win10x64
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Как составить описание функции SetFilePointerEx

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

vic7tar писал(а): 17 Июль 2019, 18:02Нет, тут не должно быть логики
Неожиданно.
С уважением, ДП
Аватара пользователя
vic7tar
Ветеран
Сообщения: 365
Зарегистрирован: 09 Февраль 2017, 20:12

Как составить описание функции SetFilePointerEx

Сообщение vic7tar »

Если в таком же стиле:
Дед Пахом писал(а): 16 Июль 2019, 16:31спасибо, не надо.
то ну ладно уж.
C10, Win10x64
Алексей- Софт-Центр
Ветеран
Сообщения: 390
Зарегистрирован: 26 Август 2009, 12:41
Откуда: Moscow
Контактная информация:

Как составить описание функции SetFilePointerEx

Сообщение Алексей- Софт-Центр »

Добрый день!
vic7tar писал(а): 17 Июль 2019, 18:02 Вопрос к стартеру - если не секрет, для чего нужна эта функция?
Работаю с файлами больших размеров, 500 Гб , например.
kreator писал(а): 17 Июль 2019, 15:18В equates.clw есть группа int64. Скорее всего, то, что надо.
Да, нашел i64.INC файл. Там "математика" с 64-битными целыми.,там же и описание:
! INT64 GROUP,TYPE
! lo ULONG
! hi LONG
! END
!
! UINT64 GROUP,TYPE
! lo ULONG
! hi ULONG
! END
С API - вроде разобрался. (Вариант Деда Пахома - спасибо)
теперь "плаваю" с присвоением int64 в decimal.
Есть процедура (в i64)
!!! <summary>
!!! Store 64-bit integer value to DECIMAL variable.
!!! </summary>
!!! <param name="dest">DECIMAL variable.</param>
!!! <param name="src">64-bit integer value to store to DECIMAL variable.</param>
i64ToDecimal PROCEDURE (*DECIMAL dest, *INT64 src),RAW,NAME('Cla$i64ToDecS')
i64ToDecimal PROCEDURE (*DECIMAL dest, *UINT64 src),RAW,NAME('Cla$i64ToDecU')
Объявил
dec1 decimal(20)
А вот второй параметр - никак не принимает, что я туда только не прописывал ((((
Компиляция с ошибкой : No matching prototype available

Алексей
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Как составить описание функции SetFilePointerEx

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

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

  PROGRAM

  MAP
    INCLUDE('i64.inc')
  END

i64val                        LIKE(INT64)
decval                        DECIMAL(20)

  CODE
  i64val.lo = 1000
  i64val.hi = 777
  i64ToDecimal(decval, i64val)
  MESSAGE('Decimal='& decval)
  
  CLEAR(i64val)
  i64FromDecimal(i64val, decval)
  MESSAGE('i64.lo='& i64val.lo &', i64.hi='& i64val.hi)
С уважением, ДП
Алексей- Софт-Центр
Ветеран
Сообщения: 390
Зарегистрирован: 26 Август 2009, 12:41
Откуда: Moscow
Контактная информация:

Как составить описание функции SetFilePointerEx

Сообщение Алексей- Софт-Центр »

Добрый день!
И снова, Дед Пахом, спасибо большое !
Про Like - и не думал в эту сторону()

Алексей
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Как составить описание функции SetFilePointerEx

Сообщение kreator »

Алексей- Софт-Центр писал(а): 18 Июль 2019, 12:21 Про Like - и не думал в эту сторону()
Где-то раньше на форуме обсуждали эти переменные. Можно ещё вот так:

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

LOC:Int64             group(INT64)
                      end
А совсем без like будет доступно, вероятно, после внедрения полноценной поддержки 64 бита.
We are hard at work… for you. :)
Алексей- Софт-Центр
Ветеран
Сообщения: 390
Зарегистрирован: 26 Август 2009, 12:41
Откуда: Moscow
Контактная информация:

Как составить описание функции SetFilePointerEx

Сообщение Алексей- Софт-Центр »

Добрый день!
kreator писал(а): 18 Июль 2019, 13:56 Где-то раньше на форуме обсуждали эти переменные. Можно ещё вот так:

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

LOC:Int64             group(INT64)
                      end
А совсем без like будет доступно, вероятно, после внедрения полноценной поддержки 64 бита.
Да, так тоже работает. Спасибо)

Алексей
Ответить