Re[3]: Перекрыть _strcpy , чтоб невидно было в obj
От: Alex_Avr Россия  
Дата: 04.02.06 08:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>ок! и что теперь делать ??


А>всегда делают (по книге ) линкуют {$LINK *.obj}

А>а потом заним обьявляют функции которые нужно оттуда взять,

Это работает в случае:
1) функции в этом obj-файле не используют функции из других obj-файлов и библиотек.
2) Функции в этом obj-файле используют функции из других obj-файлов и библиотек,
но в настройкх проекта явно указано использовать соответствующие lib, obj, bpl/bpi файлы
при сборке проекта.

А>strcpy мне ненадо,я его необьявлял extern

А>и он не должен виден за пределами модуля
А>strcpy я необьявлял значит в obj он должен быть уже переведен в код,
А>почему тогда на MessageBox непишет ошибку?

В твоем файле t.obj _нет_ кода функции strcpy, а есть всего лишь указание,
что код этой функции находится вне этого obj-файла, т.е. в других модулях/
библиотеках. В obj-файле имеются две специальных таблицы — экспорта и импорта.

в таблице экспорта описывается, какие функции и переменные, реализованные в
этом модуле, могут быть использованы в других модулях.
В таблице импорта перечислены функции, используемые в этом модуле, код которых находится
где-то в других модулях (то, что у тебя написано в разделе EXTDEF в дамп-файле).

При сборке проекта специальная программа линкер/компоновщик анализирует эти
таблицы во всех obj и lib файлах, выясняет, какие функции и переменные где
находятся (осуществляет "resolving"), и формирует уже сам exe/dll/bpl файл,
где уже есть код всех используемых функций (или указание искать эти функции
в конкретных dll/bpl библиотеках; этот поиск осуществляется уже при загрузке
приложения).

Код непосредственно функций strcpy и strlen находится в библиотеке CRT (C Run-Time library)
aka RTL, которая неявно используется при сборке C/C++ приложений.

Чтобы решить твою проблему теоретически есть два способа:
1) Указать в настройках проекта использовать соответствующую библиотеку CRT
(lib-файл), название которого нужно смотреть в документации по использованному
тобой комилятору С/С++.
2) Реализовать твои функции в отдельной dll, собираемой с помощью C++ Builder
или другого компилятора C/C++. А уже эту dll использовать в своей программе
на Delphi. Мне этот вариант кажется более предпочтительным, потому что здесь нет
привязки к конкретным версиям и названиям стандартных библиотек Delphi и C++ Builder.
Соотетственно при использовании новых версий этих сред не возникнет дополнительных проблем.

Чтобы получить более конкретные рекоммендации, советую обратиься в форум "Delphi & Builder".
С уважением, Александр Авраменко.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.