Имена функций в подцепляемой DLL.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

13 июл 2007, 13:00

BBB писал(а):Absurd,
Ты упорно предлагаешь мне изменить что-то в EXPORT.DLL.
Вопрос стоит (и изначалоьно стоял) в обратном.
Возьми export.lib файл который тебе любовно сгенерировал MSVC++ вместе с dll файлом в одной директории и статично его прилинкуй к основному проекту. Все.
2B OR NOT(2B) = FF
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

13 июл 2007, 13:03

WinMain,
Спасибо. Может, я плохо описываю ситуацию, но ты единственный, кто пытаешься именно ответить на поставленный вопрос, а не предлагаешь поменять исходные условия задачи на другие, при которых ответ, в общем-то, очевиден :D
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

13 июл 2007, 13:09

Absurd писал(а):Возьми export.lib файл который тебе любовно сгенерировал MSVC++ вместе с dll файлом в одной директории и статично его прилинкуй к основному проекту. Все.
Я так с самого начала и пытался поступить :) Но линкер не находил функцию, так как в EXPORT.DLL/EXPORT.LIB она была проэкспортирована с именем "без префиксов/постфиксов"
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

13 июл 2007, 13:14

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

extern "C" {
	void func1(int arg1, char** arg2);

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

int (*func)(int, char) = (int (*)(int, char))GetProcAddress(hModule, "func1");

Где ты тут увидел префикс?
2B OR NOT(2B) = FF
Hawk
Сообщения: 215
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

13 июл 2007, 13:19

BBB, так бы и обьяснил сразу, что длл не можешь менять. Меня только удивляет как ты смог этот префикс урезать, или это не ты? На MS VC эта dll писалась ?
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

13 июл 2007, 13:28

Absurd писал(а):

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

extern "C" {
	void func1(int arg1, char** arg2);

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

int (*func)(int, char) = (int (*)(int, char))GetProcAddress(hModule, "func1");
Где ты тут увидел префикс?
Здесь префикса, разумеется, нет. Но это уже не статическая линковка (Но я, разумеется, не возражаю, что через через GetProcAddress функция находится. Интерсено было понять, возможно ли при данных "условиях задачи" подлинковаться именно статически).
Hawk писал(а):BBB, так бы и обьяснил сразу, что длл не можешь менять. Меня только удивляет как ты смог этот префикс урезать, или это не ты? На MS VC эта dll писалась ?
Да, писалась на MS VC (хотя на поставленный вопрос это никак не влияет).
"Отрезать" префикс и постфикс в экспортируемом имени удалось при помощи EXPORTS в DEF-файле.
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

13 июл 2007, 13:29

Hawk писал(а):BBB, так бы и обьяснил сразу, что длл не можешь менять. Меня только удивляет как ты смог этот префикс урезать, или это не ты? На MS VC эта dll писалась ?
Я никак не урезал префикс, тем не менее func1 в GetProcAddress видится как "func1" а не "_func1". Я так понимаю что функция экспортирована как "func1", то есть без префикса.
2B OR NOT(2B) = FF
Hawk
Сообщения: 215
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

13 июл 2007, 13:38

Absurd писал(а):Я никак не урезал префикс, тем не менее func1 в GetProcAddress видится как "func1" а не "_func1". Я так понимаю что функция экспортирована как "func1", то есть без префикса.
Да имя в таблице экспорта DLL "func1", но в lib файле оно всеравно "_func1", и линкер ищет именно _func1. А у ВВВ оно каким-то образом и в lib файле стало "func1".
Hawk
Сообщения: 215
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

13 июл 2007, 13:43

У меня никаких функций с префиксом линкер не видит если их в EXPORTS прописывать.

так работает -
EXPORTS
ExpFunc

а так ругается, что нету такой функции
EXPORTS
ExpFunc = _ExpFunc@4

и даже так ругается
EXPORTS
ExpFunc = _ExpFunc

Так что для меня это все равно загадка ккак тебе это удалось.
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

13 июл 2007, 13:55

Hawk писал(а):Да имя в таблице экспорта DLL "func1", но в lib файле оно всеравно "_func1", и линкер ищет именно _func1. А у ВВВ оно каким-то образом и в lib файле стало "func1".
Ха! Кажется, ясно как это получилось!
Absurd описал в DEF-файле фнкцию БЕЗ использования [=internalname], как это делал я.
Мое:

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

EXPORTS
  ExpFunc = _ExpFunc@4
Absurd-a:

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

EXPORTS
  ExpFunc @1
Или, можно даже без @1 (я попробовал):

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

EXPORTS
  ExpFunc 
В обоих случаях в DLL попадает имя ExpFunc. Но в первом случае в LIB-файл попадает оно же, а во втором случае в LIB-файл попадает имя _ExpFunc@4.
Поэтому в первом случае линкер из внешнего MS VC проекта функцию НЕ находит, а во втором - находит.

Если же экспортировать без DEF-файла, с помощью директивы __declspec(dllexport), т.е. в исходнике напсиать:

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

extern "C" void __declspec(dllexport) WINAPI
      ExpFunc (void);
и НИЧЕГО не писать в DEF-файле, то в оба места (DLL и LIB) попадет "декорированное" имя _ExpFunc@4 !!!

В общем, кажется, принцип понят! :)
Кажется, стало ясно, как получить внешнее (т.е. для загрузки из DLL через GetProcAddress ) "обрезаное" имя, но сохранить возможность линковать эту DLL статически из других MS VC приложений! :D
Ответить