Вызов Windows API

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
Аватара пользователя
Stertor
новенький
Сообщения: 20
Зарегистрирован: 10.08.2014 18:11:12
Контактная информация:

Вызов Windows API

Сообщение Stertor »

Здравствуйте, товарищи, подскажите, как правильно вызывать апи на лазарусе!

Допустим, я хочу вызвать FindFirstFileW. Правильно ли будет такое решение:

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

var
    hfile:thandle;
    wd:win32_find_dataw;
    path,fname:string;  // не ошибка ли это? Чем является строка в Лазарусе? Может, надо было UnicodeString?
begin
    path:='E:\'
    hfile:=findfirstfilew(pwidechar(utf8decode(path+'*.*')),wd);
    if hfile <> invalid_handle_value then
    fname:=strpas(wd.cfilename); // пытаюсь создать копию строки с данными, но не работает, сообщает, что нужно кастовать в Pchar. Разве можно кастовать массив(array[0..267] of char) в Pchar?
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

path,fname:string; // не ошибка ли это? Чем является строка в Лазарусе? Может, надо было UnicodeString?

При использовании winapi функций с суффиксом W лучше использовать WideString.

fname:=strpas(wd.cfilename); // пытаюсь создать копию строки с данными, но не работает, сообщает, что нужно кастовать в Pchar. Разве можно кастовать массив(array[0..267] of char) в Pchar?

Попробуйте fname:=strpas(@wd.cfilename[0]);

Поле cfilename должно содержать строку с завершающим нулём, поэтому @wd.cfilename[0] — корректный указатель на PWideChar.

Рекомендую обратить внимание на кроссплатформенную надстройку из модуля SysUtils:
http://www.freepascal.org/docs-html/rtl ... chrec.html
Аватара пользователя
Stertor
новенький
Сообщения: 20
Зарегистрирован: 10.08.2014 18:11:12
Контактная информация:

Сообщение Stertor »

Большое спасибо!
Обертки я уже смотрел, но не люблю. Предпочитаю вызывать API напрямую.
Ответить