Страница 3 из 4

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

Добавлено: 13 июл 2007, 13:00
Absurd
BBB писал(а):Absurd,
Ты упорно предлагаешь мне изменить что-то в EXPORT.DLL.
Вопрос стоит (и изначалоьно стоял) в обратном.
Возьми export.lib файл который тебе любовно сгенерировал MSVC++ вместе с dll файлом в одной директории и статично его прилинкуй к основному проекту. Все.

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

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

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

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

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

Добавлено: 13 июл 2007, 13:14
Absurd

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

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

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

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

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

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

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

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

Добавлено: 13 июл 2007, 13:28
BBB
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.

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

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

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

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

Добавлено: 13 июл 2007, 13:43
Hawk
У меня никаких функций с префиксом линкер не видит если их в EXPORTS прописывать.

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

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

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

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

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

Добавлено: 13 июл 2007, 13:55
BBB
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