Поиогите решить 2 проблемы при переходе на FPC

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

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

Поиогите решить 2 проблемы при переходе на FPC

Сообщение Turbid » 24.05.2006 01:32:29

Пытаюсь перейти с Delphi на FPC, но тормозят две проблемы:

1. При компилировании из IDE FPC возникает следующая ошибка:

Error: could not create d:\turbid\program.exe
Error: ld.exe:link.res: file format not recognized; treating as linker script
Error: ld.exe:link.res:1: syntax error

Если убрать галочку с параметра "Call linker after", то ошибка меняется на "Error while linking". При компилировании из командной строки ошибки не возникает.

2. При использовании некоторых функций из модуля ShellApi (Shell_NotifyIcon, ExtractIcon), находящегося в папке winunits возникает следующая ошибка: "Can't determine which overloaded function to call".
Turbid
новенький
 
Сообщения: 11
Зарегистрирован: 23.05.2006 01:49:23

Сообщение Sergei I. Gorelkin » 24.05.2006 09:15:15

По второму пункту - надо явно указывать типы аргументов:

Код: Выделить всё
var
  sfos: TSHFileOpStructA;
begin
  ...
  result := (0 = ShFileOperation(LPSHFileOpStructA(@sfos))) and (not sfos.fAnyOperationsAborted);
  ...


Это происходит потому, что функции объявлены с передачей параметов по указателю, а оператор @ по умолчанию дает нетипизированный указатель (Pointer).
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение alexs » 24.05.2006 10:17:16

аналогичная первой ошибке была у меня - методом проб и ошмбок выяснил - что не линкуется еслив имени каталога есть восклицательный знак - может у тебя тоже что-то не так?
посмотри какой получается bat файл на линковку после работы FPC.
поробуй собрать в другом каталоге
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Replicator » 24.05.2006 12:44:44

И из-за пробелов в имени тоже могут быть проблемы.
Replicator
постоялец
 
Сообщения: 154
Зарегистрирован: 30.04.2006 17:14:45
Откуда: Outer Heaven

Re: Поиогите решить 2 проблемы при переходе на FPC

Сообщение Илья Аввакумов » 24.05.2006 13:08:32

Turbid писал(а):Error: could not create d:\turbid\program.exe
Error: ld.exe:link.res: file format not recognized; treating as linker script
Error: ld.exe:link.res:1: syntax error

Ни пробелов, ни знаков препинания в имени каталога здесь вроде нет. А на link.res взглянуть-то можно?
Илья Аввакумов
новенький
 
Сообщения: 50
Зарегистрирован: 04.05.2005 15:06:42
Откуда: Екатеринбург

Сообщение Replicator » 24.05.2006 13:24:59

При компилировании из командной строки ошибки не возникает.

Так что проблема не в link.res. А, может, дать другое имя файлу ресурсов?

И еще, у меня иногда возникают проблемы с ресурсами, ошибку точно не помню. Но решаются они компилированием ресурса в объектный файл и линкованием его по {$L resource.o}
Replicator
постоялец
 
Сообщения: 154
Зарегистрирован: 30.04.2006 17:14:45
Откуда: Outer Heaven

Сообщение Turbid » 24.05.2006 15:37:23

Действительно, первая ошибка возникала из-за "!" в имени папки (надеюсь это исправят) - здесь я привел произвольную паку в качестве примера, как оказывается зря.

А на счет второй суть понял и разобрался:

Код: Выделить всё
type
  LPNOTIFYICONDATA = ^NOTIFYICONDATA;
var
  IconData: NOTIFYICONDATA;
...
Shell_NotifyIcon(NIM_ADD, LPNOTIFYICONDATA(@IconData));


Но почему в Delphi прокатывало без этого?
Turbid
новенький
 
Сообщения: 11
Зарегистрирован: 23.05.2006 01:49:23

Сообщение Sergei I. Gorelkin » 24.05.2006 17:24:02

Дельфи начал поддерживать перегрузку ф-ций начиная с четвертой версии, а когда начал, никто готовые модули переписывать не захотел.
Поэтому там ф-ции API, имеющие ANSI и UNICODE варианты, объявлены без перегрузки. Т.е. в нашем примере есть Shell_NotifyIconA, Shell_NotifyIconW и еще просто Shell_NotifyIcon, которая в точности соответствует Shell_NotifyIconA.

FreePascal же поддерживал перегрузку, наверное, с самого начала, поэтому там ANSI и UNICODE ф-ции объявлены с одинаковыми именами и разными аргументами. Другое дело, что, по-хорошему, нужно параметр, который не может принимать значение nil, передавать не по указателю, а по ссылке (т.е. procedure foo(var a: bar)) - тогда у компилятора не будет проблемы с опознанием типа параметов. Впрочем, в модуле Windows это уже на 99% сделано, а до WinUnits пока руки у разработчиков не дошли...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Turbid » 25.05.2006 12:59:03

2Sergei I. Gorelkin: Спасибо что помогли разобраться.
Turbid
новенький
 
Сообщения: 11
Зарегистрирован: 23.05.2006 01:49:23

Сообщение Turbid » 08.11.2006 00:55:38

Ну вот, еще одна проблема: в модуле mmsystem не можем найти функцию:

Код: Выделить всё
Mixer.pp(113,5) Error: Identifier not found "mixerSetControlDetails"
Mixer.pp(113,76) Error: Illegal expression
Mixer.pp(162,5) Error: Identifier not found "mixerSetControlDetails"
Mixer.pp(162,76) Error: Illegal expression
Mixer.pp(167) Fatal: There were 4 errors compiling module, stopping
Mixer.pp(8,28) Fatal: Compilation aborted
Error: C:\FPC\2.0.4\bin\i386-Win32\ppc386.exe returned an error exitcode (normal if you did not specify a source file to be compiled)


Причем с mixerGetControlDetails все в порядке. Может она есть, но под другим именем? В общем складывается ощущение, что нормально под WinApi писать не можется...

p.s. FPC 2.0.4
Turbid
новенький
 
Сообщения: 11
Зарегистрирован: 23.05.2006 01:49:23

Сообщение Sergei I. Gorelkin » 08.11.2006 12:35:39

Мда, объявления этой функции натурально нет... Причем нет даже в JEDI API Library (packages/extra/winunits/). Но что мешает самому объявить? Вопрос одной лишней строчки...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Иван Шихалев » 09.11.2006 09:01:40

Turbid писал(а):первая ошибка возникала из-за "!" в имени папки (надеюсь это исправят)

Не исправят — проблема не в FPC, а в компоновщике ld.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Сообщение SergKam » 09.11.2006 16:30:17

значит всетаки исправят. компоновщик в винде уже свой внутренний,
навкрняка там такого бага нет
SergKam
постоялец
 
Сообщения: 251
Зарегистрирован: 16.11.2005 21:31:11
Откуда: Украина,Харьков

Сообщение Turbid » 23.04.2007 23:12:11

Снова проблема с программированием под WinApi.

Каким образом я должен был догадаться, что вместо DllProc (как в Delphi) я должен использовать Dll_Process_Attach_Hook и компанию. Хорошо, что случайно нашел ответ здесь: http://freepascal.ru/forum/viewtopic.php?t=1040&highlight=dllprocessattachhook, и то, совершенно случайно.

Поиск этого дела в документации ни к чему не привел. Вопрос: где о подобных отличиях почитать подробно, иначи еще такие грабли не выдержу.
Turbid
новенький
 
Сообщения: 11
Зарегистрирован: 23.05.2006 01:49:23

Сообщение Sergei I. Gorelkin » 24.04.2007 02:35:45

Turbid писал(а):Поиск этого дела в документации ни к чему не привел. Вопрос: где о подобных отличиях почитать подробно, иначи еще такие грабли не выдержу.


Чтобы об этом прочитать, нужно сначала чтобы кто-то написал. А чтобы написать о граблях, надо сначала на них наступить. Так что пока - нравится нам это или нет - самым достоверным источником информации являются исходники...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград


Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru