Страница 1 из 1

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

Добавлено: 17 Июль 2019, 12:06
Алексей- Софт-Центр
Добрый день!
Как описать 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 ?

Алексей

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

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

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

SetFilePointerEx(UNSIGNED,LONG lowLongDistanceToMove,LONG hiLongDistanceToMove,LONG pNewFilePointer,ULONG),BOOL,PASCAL,RAW,NAME('SetFilePointerEx')

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

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

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

liDistanceToMove REAL
STR STRING(8),OVER(liDistanceToMove)
А в STR пишем побайтно... Паскалевское соглашение о связях такие пассажи пропускает... :-)

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

Добавлено: 17 Июль 2019, 12:45
Алексей- Софт-Центр
Спасибо, сейчас попробую!

Алексей

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

Добавлено: 17 Июль 2019, 15:18
kreator
В equates.clw есть группа int64. Скорее всего, то, что надо.

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

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

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

SetFilePointerEx(UNSIGNED,LONG lowLongDistanceToMove,LONG hiLongDistanceToMove,LONG pNewFilePointer,ULONG),BOOL,PASCAL,RAW,NAME('SetFilePointerEx')
... , ulong lowLongDistanceToMove, ... - наверно так нужно писать?

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

Добавлено: 17 Июль 2019, 17:48
Дед Пахом
vic7tar писал(а): 17 Июль 2019, 17:44... , ulong lowLongDistanceToMove, ... - наверно так нужно писать?
не принципиально, но по смыслу да, ulong логичнее.

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

Добавлено: 17 Июль 2019, 18:02
vic7tar
Нет, тут не должно быть логики, вот определение:

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

...
typedef union _LARGE_INTEGER {
    struct {
        DWORD LowPart;  <-----------------------------------------------------
        LONG HighPart;
    } DUMMYSTRUCTNAME;
    struct {
        DWORD LowPart;
        LONG HighPart;
    } u;
#endif //MIDL_PASS
    LONGLONG QuadPart;
} LARGE_INTEGER;
Вопрос к стартеру - если не секрет, для чего нужна эта функция?

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

Добавлено: 17 Июль 2019, 18:16
Дед Пахом
vic7tar писал(а): 17 Июль 2019, 18:02Нет, тут не должно быть логики
Неожиданно.

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

Добавлено: 17 Июль 2019, 18:22
vic7tar
Если в таком же стиле:
Дед Пахом писал(а): 16 Июль 2019, 16:31спасибо, не надо.
то ну ладно уж.

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

Добавлено: 18 Июль 2019, 11:52
Алексей- Софт-Центр
Добрый день!
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

Алексей

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

Добавлено: 18 Июль 2019, 12:07
Дед Пахом

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

  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)

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

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

Алексей

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

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

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

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

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

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

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

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

Алексей