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

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Имена функций в подцепляемой DLL.

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

BBB » 13 июл 2007, 14:00

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

а так ругается, что нету такой функции
EXPORTS
ExpFunc = _ExpFunc@4
Возможно, не у тебя не было указано extern "C". Т.е., в любом случае ты "не угадал" внутреннее имя ф-ии, которое "создал" комплятор C++. "Железобетонный" способ узнать внутреннее имя - поискать контекстно в созданном obj-файле. Т.е. ищешь ExpFunc (так как эта часть уж всяко будет присутствовать в имени), а когда находишь, смотришь, что еще этот текст "окружает". Это и будет "внутреннее" имя, которое надо прописывать в DEF-файл, если использовать в нем конструкцию entryname=internalname

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

Absurd » 13 июл 2007, 13:56

BBB писал(а):Здесь префикса, разумеется, нет. Но это уже не статическая линковка (Но я, разумеется, не возражаю, что через через GetProcAddress функция находится. Интерсено было понять, возможно ли при данных "условиях задачи" подлинковаться именно статически).
Да, писалась на MS VC (хотя на поставленный вопрос это никак не влияет).
"Отрезать" префикс и постфикс в экспортируемом имени удалось при помощи EXPORTS в DEF-файле.
Только что воспользовался полученным lib файлом и подлинковал dll статически.
Итого имеем:

1) Метод экспротирован без префикса и GetProcAddress(hDll, "func1") работает.
2) Побочно генерируемая lib библиотека абсолютно работоспособна.

Внимание, вопрос: Нахрен тебе было извращаться с обрезанием префикса?

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

BBB » 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

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

Hawk » 13 июл 2007, 13:43

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

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

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

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

Так что для меня это все равно загадка ккак тебе это удалось.

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

Hawk » 13 июл 2007, 13:38

Absurd писал(а):Я никак не урезал префикс, тем не менее func1 в GetProcAddress видится как "func1" а не "_func1". Я так понимаю что функция экспортирована как "func1", то есть без префикса.
Да имя в таблице экспорта DLL "func1", но в lib файле оно всеравно "_func1", и линкер ищет именно _func1. А у ВВВ оно каким-то образом и в lib файле стало "func1".

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

Absurd » 13 июл 2007, 13:29

Hawk писал(а):BBB, так бы и обьяснил сразу, что длл не можешь менять. Меня только удивляет как ты смог этот префикс урезать, или это не ты? На MS VC эта dll писалась ?
Я никак не урезал префикс, тем не менее func1 в GetProcAddress видится как "func1" а не "_func1". Я так понимаю что функция экспортирована как "func1", то есть без префикса.

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

BBB » 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-файле.

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

Hawk » 13 июл 2007, 13:19

BBB, так бы и обьяснил сразу, что длл не можешь менять. Меня только удивляет как ты смог этот префикс урезать, или это не ты? На MS VC эта dll писалась ?

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

Absurd » 13 июл 2007, 13:14

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

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

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

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

Где ты тут увидел префикс?

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

BBB » 13 июл 2007, 13:09

Absurd писал(а):Возьми export.lib файл который тебе любовно сгенерировал MSVC++ вместе с dll файлом в одной директории и статично его прилинкуй к основному проекту. Все.
Я так с самого начала и пытался поступить :) Но линкер не находил функцию, так как в EXPORT.DLL/EXPORT.LIB она была проэкспортирована с именем "без префиксов/постфиксов"

Вернуться к началу