Поиск:

Ответ в темуСоздание новой темы Создание опроса
> странности dllimport & dllexport, динамические библиотеки 
:(
    Опции темы
jonie
Дата 12.5.2007, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



итак, имеем : две EXE модуля, один из которых экспортирует а другой соотв. импортирует функцию (оба проекта обычные, консольные)
Код

//библиотека. файл testDLL.cpp
#include <windows.h>
#define DllExport   __declspec( dllexport )

DllExport void foo(){
    MessageBoxA(0,"Message","Caption",0);
}

int main(){    return 0;}


Код

#pragma comment(lib,"testDLL.lib")     //подрубим либ для статической линковки библотеки.
#define DllImport   __declspec( dllimport )

DllImport void foo();

int main(){
    foo();           //вызов функции из библиотеки
    return 0;
}

вроде бы все ок. компилируется.
В импортной секции второго модуля значится ссылка на первый модуль, функцию foo():
Код

0 foo                         │ testDLL.exe


 в экспортной секции первого экспорт foo():
Код

1  .004110F0 ?foo@@YAXXZ

но вот реализация foo() в первом модуле мягко говоря странная (данные студии при отладке второго (запускающего foo()) модуля)... точнее даже не реализация, а то как это "проецируется" чтоли (хз как это звать):
Код

....
;    MessageBoxA(0,"Message","Caption",0);
003413CE  mov         esi,esp 
003413D0  push        0    
003413D2  push        415748h 
003413D7  push        offset string L"crtexe.c" (41573Ch) ; <-- ???
003413DC  push        0    
003413DE  call        dword ptr [__imp_foo (418338h)]      <--- рекурсия бесконечная, как сделствие вылет из программы.

при том что собсвенно в модуле1 (экспортирующий foo()) все должно быть ОК:
Код

.004113CE:                    mov         esi,esp
.004113D0:                    push        000
.004113D2:                    push        000415748 ;'Caption'
.004113D7:                    push        00041573C ;'Message'
.004113DC:                    push        000
.004113DE:                    call        MessageBoxA ;USER32

собственно вопросы: что за чудо-трава, и как ее курить ?.....
откуда такой код получается, и кто виноват (подозреваю что Я)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Smarts
Дата 13.5.2007, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.4.2007

Репутация: нет
Всего: 2



Цитата(jonie @  12.5.2007,  14:34 Найти цитируемый пост)
итак, имеем : двa EXE модуля, один из которых экспортирует а другой соотв. импортирует функцию (оба проекта обычные, консольные)

Может быть все-таки стоит экспортировать из dll, a не из exe? smile 

Это сообщение отредактировал(а) Smarts - 13.5.2007, 19:12
PM MAIL   Вверх
jonie
Дата 13.5.2007, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



dll не интересно, с dll все могут .... 
вообще можно както выковырять и из exe , вопрос КАК собственно и стал основой темы...
углядел такое строение exe-шки у ACDSee7......
----
export "C" помогает, конечно и загрузка динамическая, но это не наш метод....

Это сообщение отредактировал(а) jonie - 13.5.2007, 19:47


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Smarts
Дата 13.5.2007, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.4.2007

Репутация: нет
Всего: 2



При подключении .lib ты используешь раннее связывание и в самом lib файле нет твоих функций, а только информация для загрузки библиотеки при запуске программы... Попробуй без подключения lib (позднее связывание - загрузка во время выполнения):

Код

typedef void (*MYFUNCTION)(void);
 
void StartFoo()
{
MYFUNCTION   pFoo=0;   //указатель на  Foo()
HINSTANCE    hMyDll = LoadLibrary("testDLL.dll"); // попробуй ехе, но не уверен что сработает...
 

if(hMyDll != NULL)
{
   pFoo = (MYFUNCTION) GetProcAddress(hMyDll, "Foo");
   if(!pFoo)   
      FreeLibrary(hMyDll);
   else
   {
      pFoo();
      FreeLibrary(hMyDll);
    }
}
}


А вообще - смысл загрузки из ехе? Ведь не зря же пишем 
#define DllImport   __declspec( dllimport )

Это сообщение отредактировал(а) Smarts - 13.5.2007, 22:33
PM MAIL   Вверх
jonie
Дата 13.5.2007, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Цитата

А вообще - смысл загрузки из ехе?
академический интерес...
с динамикой умирает удобство такое как перегрузка... это раз, во вторых не работает , это два.... код лучше при выполнении не становится, хотя ошибок "на уровне winAPI (проверки на нули возрата)" нет...
----
ОК. расширим вопрос: 1) зачем в exe есть экспорт 2)если уж он есть, то как же так исхитриться его использовать?)
если кого заинтересует бросаю в архиве исходник решения чтоб не писать самим) ~3 kB


Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  testDLL.7z 3,24 Kb


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Smarts
Дата 13.5.2007, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.4.2007

Репутация: нет
Всего: 2



Если динамически не работает, то думаю и статически не пройдет (первый пост smile)
А раздел экспорта есть, так как формат у ехе и dll один и тот же - Portable Executeable (PE)
PM MAIL   Вверх
jonie
Дата 13.5.2007, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



ок) но что насчет 2)если уж он есть, то как же так исхитриться его использовать?) ? и собственно я приводил пример acdsee7.exe .... накой то черт они там сделали экспорт из ехе-ки.....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Earnest
Дата 14.5.2007, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



При динамической загрузке (LoadLibrary + GetProcAddress) должно вроде работать. Я когда-то делала. 
Только, как мне помнится дело было так: EXE был таки один, и он зависел от некой DLL. И вот внутри этой DLL приспичило получить достук к одной из функций EXE. Вот тогда-то, чтобы не редизайнить сильно, функцию из EXE экспортировали, и в DLL через GetProcAddress использовали. Доступ к EXE получали через LoadLibrary (вроде).
Потом, конечно, это кривье переделали.



--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0542 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.