Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/27: Рейтинг темы: голосов - 27, средняя оценка - 4.63
77 / 35 / 0
Регистрация: 04.04.2011
Сообщений: 78
Записей в блоге: 1
1

GetProcAddress не может получить адрес ф-ии из dll

08.04.2011, 21:56. Показов 5625. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Осваиваю написание dll, GetProcAddress не может получить адрес ф-ии из моей dllки? Где может быть засада? В экспоре ф-я вроде должна быть… поскольку…
код dll... все пишется на просто - Си.
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <Windows.h>
#include "dllmain.h"
 
extern _declspec(dllexport) int __stdcall Multiply( int a, int b)
{
  return a * b;
}
 
BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{
  return TRUE;
}
в проге ее используюшей

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
 
typedef int (__stdcall *MULTIPLY)(int a, int b);
 
int main(int argc, char* argv[]) 
{
  HMODULE hLib = LoadLibrary("dlltest.dll"); // Загружаем библиотеку
  
  if (hLib)
  {
    MULTIPLY Multiply;
    printf("dll loaded...\n");
 
    Multiply = (MULTIPLY)GetProcAddress(hLib, "Multiply"); // Загружаем функцию
    if (Multiply) 
    {
      int result;
      printf("Multiply function loaded...\n");
      
      result = Multiply(2,2);
      printf("Multiply(2,2) %d\n", result);
    }
   FreeLibrary(hLib);
  }
  getch();
}
либа успешно загружается а ф-я неть(
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.04.2011, 21:56
Ответы с готовыми решениями:

GetProcAddress не может найти функцию в dll
Хочу сделать глобальный хук клавиатуры. Сделал отдельный DLL со всем, что мне надо. Подрубаю DLL в...

не может получить адрес сетевой
Здрасце,вот у меня вай фай не подключается к модему ADSL , все время обновляет адрес сетевой, но...

Win7 не может получить динамический ip-адрес
Доброго времени суток Проблема: после переустановки Win 7 на ноутбуке он не может подключиться к...

Как получить адрес функции в DLL
Я пишу расширение для текстового редактора исходников от которого у меня нет. Суть в том что перед...

15
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
08.04.2011, 22:00 2
.def есть? может быть имена декорированы по-умолчанию - вообщем проверьте через dumpbin /exports - те проверьте, что в dll правда все нормально
1
77 / 35 / 0
Регистрация: 04.04.2011
Сообщений: 78
Записей в блоге: 1
08.04.2011, 23:04  [ТС] 3

Не по теме:

Dump of file dlltest.dll

File Type: DLL

Section contains the following exports for dlltest.dll

00000000 characteristics
4D9E5491 time date stamp Fri Apr 08 04:19:29 2011
0.00 version
1 ordinal base
1 number of functions
1 number of names

ordinal hint RVA name

1 0 00001000 _Multiply@8

Summary

2000 .data
2000 .rdata
1000 .reloc
5000 .text



1 0 00001000 _Multiply@8 - это же она? и она в экспорт листе насколько я понял.

Добавлено через 16 минут
Подправил имя в программе заработало)
C
1
Multiply = (MULTIPLY)GetProcAddress(hLib, "_Multiply@8");
Но как можно избежать изменения имени ф-ии? что бы было как и написанно - "Multiply", а не "_Multiply@8"
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
08.04.2011, 23:06 4
1) проверьте что возвращает GetLastError
2) для dll используется тот же компилятор? попробуйте в проекте dll создать def файл http://msdn.microsoft.com/en-u... s.80).aspx

Добавлено через 55 секунд
Цитата Сообщение от goto Посмотреть сообщение
Но как можно избежать изменения имени ф-ии? что бы было как и написанно - "Multiply", а не "_Multiply@8"
через .def
либо через pragma - но не помню как, Рихтера почитать надо, но через def самое удобное
1
14 / 14 / 1
Регистрация: 04.04.2011
Сообщений: 70
08.04.2011, 23:15 5
не надо никаких дефов.
Просто подчеркивание при загрузке и все.
@8 - Это тоже не надо. В спеках и туториалах русским по белому написано, что ввиду особенностей компилятора и стандарта имя предваряется символом "_"
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
08.04.2011, 23:19 6
wolf.diesel, пардон, если не путаю только в том случае когда ++ код вызывается в си, и потом декорация, то бишь @8 нужна для определения типов параметров
тут же для GetProcAddress важно лишь как оно в таблице экспорта выглядит
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.04.2011, 08:57 7
Цитата Сообщение от goto Посмотреть сообщение
все пишется на просто - Си.
Проблема в том, что это не Си.

C++
1
2
3
4
5
6
7
extern "C"
{
     int Multiply( int a, int b)
    {
        return a * b;
    }
}
И никаких проблем с декорированием.
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
09.04.2011, 13:09 8
Deviaphan, если код в ++ проекте, может там и так pureC?
к тому же от плюсов декорирование только в подчеркивании
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.04.2011, 13:13 9
Цитата Сообщение от alex_x_x Посмотреть сообщение
может там и так pureC?
Тогда бы не было extern "C++"
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
09.04.2011, 13:30 10
Цитата Сообщение от Deviaphan Посмотреть сообщение
Тогда бы не было extern "C++"
где ?
его и нету, так как в си нету extern "*"
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.04.2011, 13:35 11
Зато, в С++ есть.)
Можно делать "С++" внутри "С".)
Не знаю зачем, но можно.
0
77 / 35 / 0
Регистрация: 04.04.2011
Сообщений: 78
Записей в блоге: 1
09.04.2011, 15:52  [ТС] 12
Можно делать "С++" внутри "С".)
помоему у extern "C" обратная мысль) поддержка С костылей врутри С++, extern "C" чистый Си не держит - ругается именно на - "С"
использую пока вариант с .def с ним все нормально с именами, причем приходится "_declspec(dllexport)" убирать, а иначе студия - ругатцо и *def игнорит, способ добавления ф-й в таблицу экспотра похоже нужно выбирать какой-то один.
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.04.2011, 16:00 13
Цитата Сообщение от goto Посмотреть сообщение
помоему у extern "C" обратная мысль
Ой, ступил. Да. Виноват. Пошёл плакать.
1
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
09.04.2011, 16:17 14
Цитата Сообщение от goto Посмотреть сообщение
помоему у extern "C" обратная мысль) поддержка С костылей врутри С++, extern "C" чистый Си не держит - ругается именно на - "С"
он предназначен для выполнения с++ го кода внутри си-кода, поэтому плюсовые функции объявляются как поддерживающие си
поэтому и пишут
C++
1
2
3
4
5
6
7
8
#ifdef __cplusplus
extern "C"
{
#endif
// объявления
#ifdef __cplusplus
}
#endif
Цитата Сообщение от goto Посмотреть сообщение
использую пока вариант с .def с ним все нормально с именами, причем приходится "_declspec(dllexport)" убирать, а иначе студия - ругатцо и *def игнорит, способ добавления ф-й в таблицу экспотра похоже нужно выбирать какой-то один
вот наверно в чем соль была, когда вы компилировали dll - там должно было быть _declspec(dllimport) объявлено?
1
77 / 35 / 0
Регистрация: 04.04.2011
Сообщений: 78
Записей в блоге: 1
09.04.2011, 18:00  [ТС] 15
он предназначен для выполнения с++ го кода внутри си-кода
это только к ф-ям относится? с++ по особому их именует? и что бы си их понял обрамляют декларации ф-й extern "C"? в хеадерах часто такая конструкчия встречаестся, и мне думалось что все с точность да наоборот, чтобы С++ понял функцию С и импортировал как надо. понятно теперь, спс за справку.

вот наверно в чем соль была, когда вы компилировали dll - там должно было быть _declspec(dllimport) объявлено?
если писать extern _declspec(dllimport) без *.defa - имена будут вида - _Multiply@8.
сейчас попробовал *.def + extern _declspec(dllimport) имя вида - Multiply. и ругатся не стало, хотя недавно именно при совмещении этих двух способов студия игнорила EXPORTS в def'e - странно.
еще попробовал только с *.def'ом...
C
1
2
3
4
int __stdcall Multiply( int a, int b)
{
  return a * b;
}
даже так экспортится нормально, имя вида - Multiply, похоже это наилучший вариант.
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.04.2011, 18:43 16
Цитата Сообщение от goto Посмотреть сообщение
он предназначен для выполнения с++ го кода внутри си-кода
Я имел в виду, что когда в С++ коде делается блок с функциями С, внутри него всё равно можно объявить С++ функции. Возможно, в новых компиляторах и внутри кода на С можно делать декорирование как в С++ (смысла не вижу, но вдруг). В общем, я код ТС плохо посмотрел.)
0
09.04.2011, 18:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.04.2011, 18:43
Помогаю со студенческими работами здесь

Получить имя и адрес DLL файла
Добрый день. Встала задача: 1. Получить имя и адрес DLL файла 2. Определить тип (managed/native)...

Загрузка переменной из DLL (GetProcAddress не берет значение переменной из *.dll)
GetProcAddress не берет значение переменной из *.dll Не могу понять почему. Помогите....

после заражения ноутбук не может получить адрес по DHCP
проблема в заголовке темы. история как всегда банальна: касперский с просроченной лицензией и...

Как получить адрес функции в dll стороннего процесса?
Я подцепляюсь к чужому процессу, модифицирую память. Как рабочее пространство использую ненужную...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru