Возьми export.lib файл который тебе любовно сгенерировал MSVC++ вместе с dll файлом в одной директории и статично его прилинкуй к основному проекту. Все.BBB писал(а):Absurd,
Ты упорно предлагаешь мне изменить что-то в EXPORT.DLL.
Вопрос стоит (и изначалоьно стоял) в обратном.
Имена функций в подцепляемой DLL.
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
-
- Сообщения: 1213
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
2B OR NOT(2B) = FF
WinMain,
Спасибо. Может, я плохо описываю ситуацию, но ты единственный, кто пытаешься именно ответить на поставленный вопрос, а не предлагаешь поменять исходные условия задачи на другие, при которых ответ, в общем-то, очевиден
Спасибо. Может, я плохо описываю ситуацию, но ты единственный, кто пытаешься именно ответить на поставленный вопрос, а не предлагаешь поменять исходные условия задачи на другие, при которых ответ, в общем-то, очевиден
Я так с самого начала и пытался поступить Но линкер не находил функцию, так как в EXPORT.DLL/EXPORT.LIB она была проэкспортирована с именем "без префиксов/постфиксов"Absurd писал(а):Возьми export.lib файл который тебе любовно сгенерировал MSVC++ вместе с dll файлом в одной директории и статично его прилинкуй к основному проекту. Все.
-
- Сообщения: 1213
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Код: Выделить всё
extern "C" {
void func1(int arg1, char** arg2);
Код: Выделить всё
int (*func)(int, char) = (int (*)(int, char))GetProcAddress(hModule, "func1");
Где ты тут увидел префикс?
2B OR NOT(2B) = FF
BBB, так бы и обьяснил сразу, что длл не можешь менять. Меня только удивляет как ты смог этот префикс урезать, или это не ты? На MS VC эта dll писалась ?
Здесь префикса, разумеется, нет. Но это уже не статическая линковка (Но я, разумеется, не возражаю, что через через GetProcAddress функция находится. Интерсено было понять, возможно ли при данных "условиях задачи" подлинковаться именно статически).Absurd писал(а):Код: Выделить всё
extern "C" { void func1(int arg1, char** arg2);
Где ты тут увидел префикс?Код: Выделить всё
int (*func)(int, char) = (int (*)(int, char))GetProcAddress(hModule, "func1");
Да, писалась на MS VC (хотя на поставленный вопрос это никак не влияет).Hawk писал(а):BBB, так бы и обьяснил сразу, что длл не можешь менять. Меня только удивляет как ты смог этот префикс урезать, или это не ты? На MS VC эта dll писалась ?
"Отрезать" префикс и постфикс в экспортируемом имени удалось при помощи EXPORTS в DEF-файле.
-
- Сообщения: 1213
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Я никак не урезал префикс, тем не менее func1 в GetProcAddress видится как "func1" а не "_func1". Я так понимаю что функция экспортирована как "func1", то есть без префикса.Hawk писал(а):BBB, так бы и обьяснил сразу, что длл не можешь менять. Меня только удивляет как ты смог этот префикс урезать, или это не ты? На MS VC эта dll писалась ?
2B OR NOT(2B) = FF
Да имя в таблице экспорта DLL "func1", но в lib файле оно всеравно "_func1", и линкер ищет именно _func1. А у ВВВ оно каким-то образом и в lib файле стало "func1".Absurd писал(а):Я никак не урезал префикс, тем не менее func1 в GetProcAddress видится как "func1" а не "_func1". Я так понимаю что функция экспортирована как "func1", то есть без префикса.
У меня никаких функций с префиксом линкер не видит если их в EXPORTS прописывать.
так работает -
EXPORTS
ExpFunc
а так ругается, что нету такой функции
EXPORTS
ExpFunc = _ExpFunc@4
и даже так ругается
EXPORTS
ExpFunc = _ExpFunc
Так что для меня это все равно загадка ккак тебе это удалось.
Ха! Кажется, ясно как это получилось!Hawk писал(а):Да имя в таблице экспорта DLL "func1", но в lib файле оно всеравно "_func1", и линкер ищет именно _func1. А у ВВВ оно каким-то образом и в lib файле стало "func1".
Absurd описал в DEF-файле фнкцию БЕЗ использования [=internalname], как это делал я.
Мое:
Код: Выделить всё
EXPORTS
ExpFunc = _ExpFunc@4
Код: Выделить всё
EXPORTS
ExpFunc @1
Код: Выделить всё
EXPORTS
ExpFunc
Поэтому в первом случае линкер из внешнего MS VC проекта функцию НЕ находит, а во втором - находит.
Если же экспортировать без DEF-файла, с помощью директивы __declspec(dllexport), т.е. в исходнике напсиать:
Код: Выделить всё
extern "C" void __declspec(dllexport) WINAPI
ExpFunc (void);
В общем, кажется, принцип понят!
Кажется, стало ясно, как получить внешнее (т.е. для загрузки из DLL через GetProcAddress ) "обрезаное" имя, но сохранить возможность линковать эту DLL статически из других MS VC приложений!