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

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

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

Ответить
Alex. S
новенький
Сообщения: 39
Зарегистрирован: 22.08.2015 10:37:00

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

Сообщение Alex. S »

Есть такой код:

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

...

{$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 11:06:29, всего редактировалось 2 раза.
Alex2013
долгожитель
Сообщения: 3234
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

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

Сообщение Alex. S »

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"
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Вы бы дали минимальный компилируемый пример, а не "выдирку" кода.
Имхо не совпадают описания функций - то что ждет 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.
Alex. S
новенький
Сообщения: 39
Зарегистрирован: 22.08.2015 10:37:00

Сообщение Alex. S »

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

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

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

Думаю, вопрос решён :)
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

Alex. S, кстати, по возможности лучше не связываться с реестром. От этого страдает переносимость.
Alex. S
новенький
Сообщения: 39
Зарегистрирован: 22.08.2015 10:37:00

Сообщение Alex. S »

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

P.S. Я не фанат Windows ;) Работа есть работа...
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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

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


Не... я так не могу... нервное это занятие.
Alex. S
новенький
Сообщения: 39
Зарегистрирован: 22.08.2015 10:37:00

Сообщение Alex. S »

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

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

Сообщение Лекс Айрин »

Alex. S, майкрософт славится привычкой менять внутреннюю структуру системы. Так что... гарантий дать нельзя((
Пока, к счастью, ничего особо фатального не происходило,... но тенденция малость напрягающая.
Alex. S
новенький
Сообщения: 39
Зарегистрирован: 22.08.2015 10:37:00

Сообщение Alex. S »

Лекс Айрин, Вы не в курсе, там от XP (я на ней проверяю), до последней версии Windows, не сильно что-то изменилось в плане Win Api?
Есть диск с Win 7, но её нужно ещё настраивать... А так, сам давно на Ubuntu сижу, и вполне доволен :)
Последний раз редактировалось Alex. S 25.01.2016 19:36:12, всего редактировалось 1 раз.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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

Я сам дома на убунте сидел, пока комп не сломался((( хотелось бы что-нибудь получше, но пока не нашел.
Alex. S
новенький
Сообщения: 39
Зарегистрирован: 22.08.2015 10:37:00

Сообщение Alex. S »

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

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

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

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

P.S. Думаю, пора сворачивать офф-топ. Проблема решена...
Спасибо всем, кто ответил, в частности zub, за предоставленное решение :)
Ответить