Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вызов функции из dll, ide dev-c++ 
:(
    Опции темы
kerser
Дата 26.4.2008, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Функция в dll должна вызвать функцию, которая находится в windows-приложении. Т. е.

bool func()
 {
  double pr=1.2;
  if (asd(pr)) //функция в windows-приложении
   return 1;
  else
   return 0;
 }

В windows-приложении:
bool asd(double pr)
 {
   return 1;
 }

При компиляции выдаются ошибки:
 [Linker error] undefined reference to `_Z10asdd@8'
 ld returned 1 exit status 
 c:\Dev-Cpp\KT\Makefile.win [Build Error]  [Ktdll.dll] Error 1

ide - dev-c++

PM MAIL   Вверх
xvr
Дата 28.4.2008, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Передать функцию asd из приложения в dll при инициализации последней. Явный экспорт функций из exe в dll невозможен (IMHO).
Можно еще попробовать динамически через GetProcAddress(GetModuleHandle(NULL),"asd").
Но функция asd в таком случае должна экспортироваться из exe (например через __declspec( dllexport) )



PM MAIL   Вверх
kerser
Дата 29.4.2008, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Можно еще попробовать динамически через GetProcAddress(GetModuleHandle(NULL),"asd").
Но функция asd в таком случае должна экспортироваться из exe (например через __declspec( dllexport) )

Есть приложение proc5. В нем вызываю ф-цию func из dll:
case WM_PAINT:
 {
   PAINTSTRUCT ps;
   char str[3];
   int a=func(12);    // функция func находится в dll 
   wsprintf(str, "%d", a);
   HDC hDC=BeginPaint(hwnd, &ps);
   TextOut(hDC, 10, 10, str, 3);
   EndPaint(hwnd, &ps);  
   break;  
  }

В dll в ф-ции func вызываю ф-цию qw, которая находится в приложении qwert:
int func(int k)
 {
  typedef int (*ggg) (int);
  HMODULE hm=GetModuleHandle("qwert.exe");
  ggg aaa=(ggg)GetProcAddress(hm, "qw"); // функция qw находится в приложении qwert
  k=k+7;
  if (aaa!=0)
   {
    k=aaa(k);
   }
  return k;
 }

В qwert.h:
__declspec(dllexport) int __stdcall qw(int);

В qwert.cpp:
int qw(int k)
 {
  k=k+1000;
  return k;
 }

Ошибка в том, что ф-ция GetModuleHandle возвращает 0. Подскажите, пожалуйста, как исправить.
PM MAIL   Вверх
xvr
Дата 29.4.2008, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(kerser @ 29.4.2008,  18:22)
Цитата

Можно еще попробовать динамически через GetProcAddress(GetModuleHandle(NULL),"asd").
Но функция asd в таком случае должна экспортироваться из exe (например через __declspec( dllexport) )

Есть приложение proc5. В нем вызываю ф-цию func из dll:
case WM_PAINT:
 {
   PAINTSTRUCT ps;
   char str[3];
   int a=func(12);    // функция func находится в dll 
   wsprintf(str, "%d", a);
   HDC hDC=BeginPaint(hwnd, &ps);
   TextOut(hDC, 10, 10, str, 3);
   EndPaint(hwnd, &ps);  
   break;  
  }

В dll в ф-ции func вызываю ф-цию qw, которая находится в приложении qwert:
int func(int k)
 {
  typedef int (*ggg) (int);
  HMODULE hm=GetModuleHandle("qwert.exe");

Нужно GetModuleHandle(NULL) - вернет handle приложения

Цитата

 ggg aaa=(ggg)GetProcAddress(hm, "qw"); // функция qw находится в приложении qwert

В qwert.h:
__declspec(dllexport) int __stdcall qw(int);

В qwert.cpp:
int qw(int k)
В GetProcAddress функция будет называться не qw а гораздо замысловатее - сработает C++ mangling имен, окружи
__declspec(dllexport) int __stdcall qw(int); скобками extern "C" :
Код

extern "C" {
__declspec(dllexport) int __stdcall qw(int);
}
После этого функция все равно не будет qw, а будет _qw@4, это имя и подавай в GetProcAddress

PM MAIL   Вверх
kerser
Дата 29.4.2008, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Переделал так
В dll:
Код

int func(int k)
 {
  typedef int (*ggg) (int);
  HMODULE hm=GetModuleHandle(NULL);
  ggg aaa=(ggg)GetProcAddress(hm, "_qw@4");
  k=k+7;
  if (aaa!=0)
   k=aaa(k);
  return k;
 }

В qwert.h
Код

extern "C" {__declspec(dllexport) int __stdcall qw(int);}

GetProcAddress возвращает 0, не пойму, где ошибка
PM MAIL   Вверх
586
Дата 29.4.2008, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 39
Всего: 146



Таблицу экспорта не дано посмотреть?
PM   Вверх
kerser
Дата 1.5.2008, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



С помощью dumpbin смотрю таблицу импорта dll (хотя я ее и не вижу):
Код


Dump of file c:\dev-cpp\libget.a

File Type: LIBRARY

  Summary

           0 .bss
           0 .data
          14 .idata$2
          10 .idata$4
          10 .idata$5
          1C .idata$6
          10 .idata$7
          10 .text



Таблица экспорта dll, но здесь все нормально, dll экспортирует функцию func:
Код


Dump of file c:\dev-cpp\libget.a

File Type: LIBRARY

     Exports

       ordinal    name

                  __Z4funci@4
                  __Z4funci

  Summary

           0 .bss
           0 .data
          14 .idata$2
          10 .idata$4
          10 .idata$5
          1C .idata$6
          10 .idata$7
          10 .text


Таблица экспорта приложения qwert (ее тоже нет):
Код


Dump of file c:\dev-cpp\qwert.exe

File Type: EXECUTABLE IMAGE

  Summary

        1000 .bss
        1000 .data
        1000 .idata
        1000 .rdata
        1000 .text


Т. е. получается, что функция qw не импортируется в длл, и не экспортируется из приложения?
GetProcAddress возвращает 0. Подскажите, пожалуйста, что не правильно.
PM MAIL   Вверх
586
Дата 1.5.2008, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 39
Всего: 146



Значит, в приложении дело.
Цитата(kerser @  29.4.2008,  19:22 Найти цитируемый пост)
В dll в ф-ции func вызываю ф-цию qw, которая находится в приложении qwert:
int func(int k)
 {
  typedef int (__stdcall*ggg) (int);
  HMODULE hm=GetModuleHandle("qwert.exe");
  ggg aaa=(ggg)GetProcAddress(hm, "qw"); // функция qw находится в приложении qwert
  k=k+7;
  if (aaa!=0)
   {
    k=aaa(k);
   }
  return k;
 }

В qwert.h:
extern "C" __declspec(dllexport) int __stdcall qw(int);

В qwert.cpp:
int __stdcall qw(int k)
 {
  k=k+1000;
  return k;
 }

PM   Вверх
kerser
Дата 3.5.2008, 06:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Таблица экспорта приложения qwert, где находится функция, которую надо вызвать из dll:

Код

Dump of file c:\dev-cpp\qwert.exe

File Type: EXECUTABLE IMAGE

  Section contains the following exports for qwert.exe

           0 characteristics
    4819F967 time date stamp Thu May 01 20:09:59 2008
        0.00 version
           1 ordinal base
           1 number of functions
           1 number of names

    ordinal hint RVA      name

          1    0 00001472 qw@4

  Summary

        1000 .bss
        1000 .data
        1000 .edata
        1000 .idata
        1000 .rdata
        1000 .reloc
        1000 .text



А вот таблицы импорта dll нет, чего я только уже не делал.
PM MAIL   Вверх
xvr
Дата 3.5.2008, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(kerser @ 3.5.2008,  06:46)
Таблица экспорта приложения qwert, где находится функция, которую надо вызвать из dll:

Код

Dump of file c:\dev-cpp\qwert.exe

File Type: EXECUTABLE IMAGE

  Section contains the following exports for qwert.exe

           0 characteristics
    4819F967 time date stamp Thu May 01 20:09:59 2008
        0.00 version
           1 ordinal base
           1 number of functions
           1 number of names

    ordinal hint RVA      name

          1    0 00001472 qw@4

  Summary

        1000 .bss
        1000 .data
        1000 .edata
        1000 .idata
        1000 .rdata
        1000 .reloc
        1000 .text



О! Экспорт уже появился (только почему то без подчеркивания).
Цитата

А вот таблицы импорта dll нет, чего я только уже не делал.
При runtime связывании через GetProcAddress ее и не будет. Только в GetProcAddress надо подавать имя "qw@4", а не "_qw@4"

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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