Поиогите решить 2 проблемы при переходе на FPC
Модератор: Модераторы
Поиогите решить 2 проблемы при переходе на FPC
Пытаюсь перейти с 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".
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".
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
По второму пункту - надо явно указывать типы аргументов:
Это происходит потому, что функции объявлены с передачей параметов по указателю, а оператор @ по умолчанию дает нетипизированный указатель (Pointer).
Код: Выделить всё
var
sfos: TSHFileOpStructA;
begin
...
result := (0 = ShFileOperation(LPSHFileOpStructA(@sfos))) and (not sfos.fAnyOperationsAborted);
...
Это происходит потому, что функции объявлены с передачей параметов по указателю, а оператор @ по умолчанию дает нетипизированный указатель (Pointer).
-
Replicator
- постоялец
- Сообщения: 154
- Зарегистрирован: 30.04.2006 17:14:45
- Откуда: Outer Heaven
- Контактная информация:
-
Илья Аввакумов
- новенький
- Сообщения: 50
- Зарегистрирован: 04.05.2005 15:06:42
- Откуда: Екатеринбург
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 взглянуть-то можно?
-
Replicator
- постоялец
- Сообщения: 154
- Зарегистрирован: 30.04.2006 17:14:45
- Откуда: Outer Heaven
- Контактная информация:
При компилировании из командной строки ошибки не возникает.
Так что проблема не в link.res. А, может, дать другое имя файлу ресурсов?
И еще, у меня иногда возникают проблемы с ресурсами, ошибку точно не помню. Но решаются они компилированием ресурса в объектный файл и линкованием его по {$L resource.o}
Действительно, первая ошибка возникала из-за "!" в имени папки (надеюсь это исправят) - здесь я привел произвольную паку в качестве примера, как оказывается зря.
А на счет второй суть понял и разобрался:
Но почему в Delphi прокатывало без этого?
А на счет второй суть понял и разобрался:
Код: Выделить всё
type
LPNOTIFYICONDATA = ^NOTIFYICONDATA;
var
IconData: NOTIFYICONDATA;
...
Shell_NotifyIcon(NIM_ADD, LPNOTIFYICONDATA(@IconData));
Но почему в Delphi прокатывало без этого?
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Дельфи начал поддерживать перегрузку ф-ций начиная с четвертой версии, а когда начал, никто готовые модули переписывать не захотел.
Поэтому там ф-ции API, имеющие ANSI и UNICODE варианты, объявлены без перегрузки. Т.е. в нашем примере есть Shell_NotifyIconA, Shell_NotifyIconW и еще просто Shell_NotifyIcon, которая в точности соответствует Shell_NotifyIconA.
FreePascal же поддерживал перегрузку, наверное, с самого начала, поэтому там ANSI и UNICODE ф-ции объявлены с одинаковыми именами и разными аргументами. Другое дело, что, по-хорошему, нужно параметр, который не может принимать значение nil, передавать не по указателю, а по ссылке (т.е. procedure foo(var a: bar)) - тогда у компилятора не будет проблемы с опознанием типа параметов. Впрочем, в модуле Windows это уже на 99% сделано, а до WinUnits пока руки у разработчиков не дошли...
Поэтому там ф-ции API, имеющие ANSI и UNICODE варианты, объявлены без перегрузки. Т.е. в нашем примере есть Shell_NotifyIconA, Shell_NotifyIconW и еще просто Shell_NotifyIcon, которая в точности соответствует Shell_NotifyIconA.
FreePascal же поддерживал перегрузку, наверное, с самого начала, поэтому там ANSI и UNICODE ф-ции объявлены с одинаковыми именами и разными аргументами. Другое дело, что, по-хорошему, нужно параметр, который не может принимать значение nil, передавать не по указателю, а по ссылке (т.е. procedure foo(var a: bar)) - тогда у компилятора не будет проблемы с опознанием типа параметов. Впрочем, в модуле Windows это уже на 99% сделано, а до WinUnits пока руки у разработчиков не дошли...
Ну вот, еще одна проблема: в модуле mmsystem не можем найти функцию:
Причем с mixerGetControlDetails все в порядке. Может она есть, но под другим именем? В общем складывается ощущение, что нормально под WinApi писать не можется...
p.s. FPC 2.0.4
Код: Выделить всё
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
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
- Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
Снова проблема с программированием под WinApi.
Каким образом я должен был догадаться, что вместо DllProc (как в Delphi) я должен использовать Dll_Process_Attach_Hook и компанию. Хорошо, что случайно нашел ответ здесь: http://freepascal.ru/forum/viewtopic.php?t=1040&highlight=dllprocessattachhook, и то, совершенно случайно.
Поиск этого дела в документации ни к чему не привел. Вопрос: где о подобных отличиях почитать подробно, иначи еще такие грабли не выдержу.
Каким образом я должен был догадаться, что вместо DllProc (как в Delphi) я должен использовать Dll_Process_Attach_Hook и компанию. Хорошо, что случайно нашел ответ здесь: http://freepascal.ru/forum/viewtopic.php?t=1040&highlight=dllprocessattachhook, и то, совершенно случайно.
Поиск этого дела в документации ни к чему не привел. Вопрос: где о подобных отличиях почитать подробно, иначи еще такие грабли не выдержу.
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Turbid писал(а):Поиск этого дела в документации ни к чему не привел. Вопрос: где о подобных отличиях почитать подробно, иначи еще такие грабли не выдержу.
Чтобы об этом прочитать, нужно сначала чтобы кто-то написал. А чтобы написать о граблях, надо сначала на них наступить. Так что пока - нравится нам это или нет - самым достоверным источником информации являются исходники...
