Перекрыть _strcpy , чтоб невидно было в obj
От: Аноним  
Дата: 03.02.06 19:27
Оценка:
скомпилил t.cpp (Builder5.5) в t.obj (9 kb)

В Delphi 5 пишу подключаю

implementation

{$R *.DFM}
{$LINK t.obj}

end.


Не Delphi не может скомпилить выдает

Unsatisfied forward or external declaration: '_strlen'
Unsatisfied forward or external declaration: '_strcpy'

явно немое, в t.cpp


#include <windows.h>
#pragma hdrstop

extern "C" _stdcall BOOL  MainRR(DWORD mode)
// одна функция
{

 strcpy(...
}






cмотрю tdump.exe t.obj

Turbo Dump 5.0.16.6
Display of File T.OBJ

Name: 1: 'MainRR' virtual(_TEXT) Length: 0180 bytes
000DE2 EXTDEF 2 : 'OpenProcess' Type: 0
3 : 'MessageBoxA' Type: 0
7 : '_strlen' Type: 0
8 : '_strcpy' Type: 0
...




видно что используется (но я неиспользую явно _strcpy и _strlen !!!)
как в C++ перекрыть их ,чтоб невидно было ???
ну используется и пусть,
обьявлять в Delphi буду только MainRR для использования
Re: Перекрыть _strcpy , чтоб невидно было в obj
От: Аноним  
Дата: 03.02.06 19:44
Оценка:
Что значит явно не твое? strcpy(... — твое. Значит и _strcpy — твое.
Re: Перекрыть _strcpy , чтоб невидно было в obj
От: Narrator  
Дата: 03.02.06 19:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>скомпилил t.cpp (Builder5.5) в t.obj (9 kb)


А>В Delphi 5 пишу подключаю


А>implementation


А>
А>{$R *.DFM}
А>{$LINK t.obj}

А>end.
А>


А>Не Delphi не может скомпилить выдает


А>Unsatisfied forward or external declaration: '_strlen'

А>Unsatisfied forward or external declaration: '_strcpy'

А>явно немое, в t.cpp



А>
А>#include <windows.h>
А>#pragma hdrstop

А>extern "C" _stdcall BOOL  MainRR(DWORD mode)
А>// одна функция
А>{

А> strcpy(...
А>}
А>


А в функции MainRR вызываешь strcpy? И это называется — не используешь?



А>

А>cмотрю tdump.exe t.obj

А>Turbo Dump 5.0.16.6

А>Display of File T.OBJ

А>Name: 1: 'MainRR' virtual(_TEXT) Length: 0180 bytes

А>000DE2 EXTDEF 2 : 'OpenProcess' Type: 0
А> 3 : 'MessageBoxA' Type: 0
А> 7 : '_strlen' Type: 0
А> 8 : '_strcpy' Type: 0
А>...


А>

А>видно что используется (но я неиспользую явно _strcpy и _strlen !!!)
А>как в C++ перекрыть их ,чтоб невидно было ???
А> ну используется и пусть,
А>обьявлять в Delphi буду только MainRR для использования
Re[2]: Перекрыть _strcpy , чтоб невидно было в obj
От: Аноним  
Дата: 03.02.06 21:30
Оценка:
А>> strcpy(...

N>А в функции MainRR вызываешь strcpy? И это называется — не используешь?


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

всегда делают (по книге ) линкуют {$LINK *.obj}
а потом заним обьявляют функции которые нужно оттуда взять,
strcpy мне ненадо,я его необьявлял extern
и он не должен виден за пределами модуля

strcpy я необьявлял значит в obj он должен быть уже переведен в код,
почему тогда на MessageBox непишет ошибку?
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...
Пока на собственное сообщение не было ответов, его можно удалить.