Hawk писал(а):Да имя в таблице экспорта DLL "func1", но в lib файле оно всеравно "_func1", и линкер ищет именно _func1. А у ВВВ оно каким-то образом и в lib файле стало "func1".
Ха! Кажется, ясно как это получилось!
Absurd описал в DEF-файле фнкцию БЕЗ использования
[=internalname], как это делал я.
Мое:
Absurd-a:
Или, можно даже без @1 (я попробовал):
В обоих случаях в 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 приложений!
[quote="Hawk"]Да имя в таблице экспорта DLL "func1", но в lib файле оно всеравно "_func1", и линкер ищет именно _func1. А у ВВВ оно каким-то образом и в lib файле стало "func1".[/quote]Ха! Кажется, ясно как это получилось!
[b]Absurd[/b] [url=http://forum.developing.ru/showpost.php?p=41546&postcount=11]описал в DEF-файле фнкцию[/url] БЕЗ использования [b][=internalname][/b], как это делал я.
Мое:
[code]EXPORTS
ExpFunc = _ExpFunc@4[/code][b]Absurd[/b]-a:[code]EXPORTS
ExpFunc @1[/code]
Или, можно даже без @1 (я попробовал):[code]EXPORTS
ExpFunc [/code]
В обоих случаях в DLL попадает имя ExpFunc. Но в первом случае в LIB-файл попадает оно же, а во втором случае в LIB-файл попадает имя _ExpFunc@4.
Поэтому в первом случае линкер из внешнего MS VC проекта функцию НЕ находит, а во втором - находит.
Если же экспортировать без DEF-файла, с помощью директивы __declspec(dllexport), т.е. в исходнике напсиать:[code]extern "C" void __declspec(dllexport) WINAPI
ExpFunc (void);[/code][b]и НИЧЕГО не писать в DEF-файле[/b], то в оба места (DLL и LIB) попадет "декорированное" имя _ExpFunc@4 !!!
В общем, кажется, принцип понят! :)
Кажется, стало ясно, как получить внешнее (т.е. для загрузки из DLL через GetProcAddress ) "обрезаное" имя, но сохранить возможность линковать эту DLL статически из других MS VC приложений! :D