Решено: Некорректный указатель на функцию при {$mode objfpc}

Вопросы программирования и использования среды Lazarus.

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

Решено: Некорректный указатель на функцию при {$mode objfpc}

Сообщение Alex. S » 24.01.2016 22:47:01

Есть такой код:
Код: Выделить всё
...

{$mode objfpc}

...

procedure CheckFont(const DC: HDC;);

  function EnumFontFamExProc(
    //
    var ELogFont: TEnumLogFontEx;
    //
    var Metric: TNewTextMetricEx;
    //
    FontType: LongInt; Data: Pointer): Integer; stdcall;
  begin
  //

  end;

var
//
FontData: TLOGFONTA;
begin
//
FillChar(FontData, SizeOf(FontData), 0);

//
EnumFontFamiliesEx(
  //
  DC, FontData,
  //
  WndProc(@EnumFontFamExProc), 0, 0);
end;


Почему-то, получаю сообщение:
Error: Incompatible type for arg no. 3: Got "<procedure variable type of function(LongWord,LongWord,LongInt,LongInt):LongInt;StdCall>", expected "<procedure variable type of function(var ENUMLOGFONTEX,var NEWTEXTMETRICEXA,LongInt,LongInt):LongInt;StdCall>"


Если заменить "{$mode objfpc}" на "{$mode Delphi}" и "WndProc(@EnumFontFamExProc)" на "@EnumFontFamExProc", то всё работает, но мне нужен режим FPC, а не Delphi...

Может кто подскажет, как это исправить? :?
Последний раз редактировалось Alex. S 26.01.2016 12:06:29, всего редактировалось 2 раз(а).
Alex. S
новенький
 
Сообщения: 39
Зарегистрирован: 22.08.2015 11:37:00

Re: Не правильно возвращает указатель функции при {$mode obj

Сообщение Alex2013 » 25.01.2016 08:44:45

В виде предположения... Может "WndProc(EnumFontFamExProc..." поможет ? (Без "собачки" )
а может быть нужно еще и убрать WndProс...(это ведь преобразование типа ? Зачем "тавтологию" устраивать ? )
Да еще иногда действовал трюк под названием "обезличивание переменных" в твоем случае выглядит так @EnumFontFamExProc^
Зы
EnumFontFamiliesEx(
//
DC, FontData,
//
EnumFontFamExProc, 0, 0);
или
EnumFontFamiliesEx(
//
DC, FontData,
//
@EnumFontFamExProc^, 0, 0);
Alex2013
долгожитель
 
Сообщения: 3145
Зарегистрирован: 03.04.2013 11:59:44

Re: Не правильно возвращает указатель функции при {$mode obj

Сообщение Alex. S » 25.01.2016 12:16:06

Alex2013, увы :(

При
Код: Выделить всё
EnumFontFamiliesEx(DC, FontData, @EnumFontFamExProc, 0, 0);


ошибка:
Error: Wrong number of parameters specified for call to "EnumFontFamExProc"


Так
Код: Выделить всё
EnumFontFamiliesEx(DC, FontData, WndProc(EnumFontFamExProc), 0, 0);


тоже ошибка:
Error: Wrong number of parameters specified for call to "EnumFontFamExProc"
Alex. S
новенький
 
Сообщения: 39
Зарегистрирован: 22.08.2015 11:37:00

Re: Не правильно возвращает указатель функции при {$mode obj

Сообщение zub » 25.01.2016 14:17:16

Вы бы дали минимальный компилируемый пример, а не "выдирку" кода.
Имхо не совпадают описания функций - то что ждет EnumFontFamiliesEx и ваша EnumFontFamExProc

для EnumFontFamiliesEx надо
Код: Выделить всё
FONTENUMEXPROC = function (var _para1:ENUMLOGFONTEX;var _para2:NEWTEXTMETRICEX; _para3:longint; _para4:LPARAM):longint;stdcall;

у вас
Код: Выделить всё
function EnumFontFamExProc(var ELogFont: TEnumLogFontEx;var Metric: TNewTextMetricEx;FontType: LongInt; Data: Pointer): Integer; stdcall;


Кстати еще и передача "локальной" функции...

Добавлено спустя 1 час 31 минуту 17 секунд:
Re: Не правильно возвращает указатель функции при {$mode objfpc}
в таком виде всё компилируется
Код: Выделить всё
program Project1;
{$mode objfpc}
uses windows;
function EnumFontFamExProc(var _para1:ENUMLOGFONTEX;var _para2:NEWTEXTMETRICEX; _para3:longint; _para4:LPARAM):longint;stdcall;
begin
end;
procedure CheckFont(const DC: HDC);
var
FontData: TLOGFONTA;
begin
FillChar(FontData, SizeOf(FontData), 0);
EnumFontFamiliesEx(DC, FontData,@EnumFontFamExProc,0,0);
end;
begin
end.
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Не правильно возвращает указатель функции при {$mode obj

Сообщение Alex. S » 25.01.2016 17:16:29

zub, Вы правы. Код, который Вы привели, действительно компируется без ошибок...

Просто я уже нашёл другой способ, получить все шрифты, имеющиеся в системе, методом чтения реестра...

Но, Вам большое спасибо, так как я, сам бы вряд ли до этого смог дойти!

Думаю, вопрос решён :)
Alex. S
новенький
 
Сообщения: 39
Зарегистрирован: 22.08.2015 11:37:00

Re: Не правильно возвращает указатель функции при {$mode obj

Сообщение Лекс Айрин » 25.01.2016 18:49:22

Alex. S, кстати, по возможности лучше не связываться с реестром. От этого страдает переносимость.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Не правильно возвращает указатель функции при {$mode obj

Сообщение Alex. S » 25.01.2016 19:15:25

Лекс Айрин, переносимость между Unix и Windows? Если да, то это не страшно, я всё равно под WinApi пишу. Лишь бы, на новых версиях Windows работало...

P.S. Я не фанат Windows ;) Работа есть работа...
Alex. S
новенький
 
Сообщения: 39
Зарегистрирован: 22.08.2015 11:37:00

Re: Не правильно возвращает указатель функции при {$mode obj

Сообщение Лекс Айрин » 25.01.2016 19:22:20

Alex. S, идеалом была бы переносимость между всеми платформами... но это уже нереально(((

Alex. S писал(а):Лишь бы, на новых версиях Windows работало...


Не... я так не могу... нервное это занятие.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Не правильно возвращает указатель функции при {$mode obj

Сообщение Alex. S » 25.01.2016 19:46:50

Лекс Айрин писал(а):Не... я так не могу... нервное это занятие.

Не понял. То есть, оно и на новых версиях может не работать?
Alex. S
новенький
 
Сообщения: 39
Зарегистрирован: 22.08.2015 11:37:00

Re: Не правильно возвращает указатель функции при {$mode obj

Сообщение Лекс Айрин » 25.01.2016 20:04:33

Alex. S, майкрософт славится привычкой менять внутреннюю структуру системы. Так что... гарантий дать нельзя((
Пока, к счастью, ничего особо фатального не происходило,... но тенденция малость напрягающая.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Не правильно возвращает указатель функции при {$mode obj

Сообщение Alex. S » 25.01.2016 20:15:51

Лекс Айрин, Вы не в курсе, там от XP (я на ней проверяю), до последней версии Windows, не сильно что-то изменилось в плане Win Api?
Есть диск с Win 7, но её нужно ещё настраивать... А так, сам давно на Ubuntu сижу, и вполне доволен :)
Последний раз редактировалось Alex. S 25.01.2016 20:36:12, всего редактировалось 1 раз.
Alex. S
новенький
 
Сообщения: 39
Зарегистрирован: 22.08.2015 11:37:00

Re: Не правильно возвращает указатель функции при {$mode obj

Сообщение Лекс Айрин » 25.01.2016 20:24:20

Alex. S, да вроде, не сильно.... но некоторые версии программ не идут на ХР... правда, создается впечатление, что это чисто проверка по версии ОС...

Я сам дома на убунте сидел, пока комп не сломался((( хотелось бы что-нибудь получше, но пока не нашел.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Не правильно возвращает указатель функции при {$mode obj

Сообщение Alex. S » 25.01.2016 20:40:47

Лекс Айрин писал(а):но некоторые версии программ не идут на ХР

Обратная совместимость от Microsoft ;)

Лекс Айрин писал(а):хотелось бы что-нибудь получше, но пока не нашел

Не знаю, что в ней улучшать, разве что, софта бы побольше, да драйверов... А так, сейчас даже Steam на Linux начал переходить, глядишь, и всё наладится...

P.S. Думаю, пора сворачивать офф-топ. Проблема решена...
Спасибо всем, кто ответил, в частности zub, за предоставленное решение :)
Alex. S
новенький
 
Сообщения: 39
Зарегистрирован: 22.08.2015 11:37:00


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 234

Рейтинг@Mail.ru