Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.02.2012, 14:20   #1
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию Динамическая загрузка статического метода из DLL

Собственно, динамически подгружаю DLL, в котором есть класс со статическими методами.
Код:
// DLL
// ...
class Kernel {
public:
  static void init ( );
};
// ...
Код:
HINSTANCE Dll = LoadLibrary("kernel.dll");
void (*Init) ( ) = (void (*) ( ))GetProcAddress(HINSTANCE, "???");
Какое имя использовать (вместо ???), чтобы достать Kernel::init?

UPD

Открыл libkernel.dll.def, нашел имя _ZN6Kernel4initEv, заработало, почувствовал себя быдлом. Есть способы сделать нормальное имя?
Форматируйте код, будьте людьми.

Последний раз редактировалось Granus; 15.02.2012 в 14:35.
Granus вне форума Ответить с цитированием
Старый 15.02.2012, 14:40   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Granus
ну видимо
Код:
GetProcAddress(HINSTANCE, "MyClass::Init");
вообще так делать неправильно. как правильно? объявить интерфейс, который будет использоваться и приложением, и дин библиотекой. класс дин библиотеки реализует этот интерфейс и экспортирует 2 С-style функции - ctor и dtor, которые возвращают и принимают указатель на интерфейс

Цитата:
Открыл libkernel.dll.def, нашел имя _ZN6Kernel4initEv, заработало, почувствовал себя быдлом. Есть способы сделать нормальное имя?
видимо это уже сдекорированное имя. это тебе сможет сделать сам компилятор, когда ты вызовешь
Код:
GetProcAddress(HINSTANCE, "MyClass::Init");
могу и ошибаться, не особо в технологии линковок шарю)
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 15.02.2012 в 14:45.
pproger вне форума Ответить с цитированием
Старый 15.02.2012, 14:51   #3
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
GetProcAddress(HINSTANCE, "MyClass::Init");
- пробовал, конечно. Не работает.

Цитата:
объявить интерфейс, который будет использоваться и приложением, и дин библиотекой. класс дин библиотеки реализует этот интерфейс и экспортирует 2 С-style функции - ctor и dtor, которые возвращают и принимают указатель на интерфейс
Грустно, но придется, видимо.

Цитата:
видимо это уже сдекорированное имя. это тебе сможет сделать сам компилятор, когда ты вызовешь
Да, там в имени есть даже длина и набор параметров, только видимо "MyClass::Init" ищет именно это, без декодирования :С
Форматируйте код, будьте людьми.

Последний раз редактировалось Granus; 15.02.2012 в 15:00.
Granus вне форума Ответить с цитированием
Старый 15.02.2012, 15:12   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Granus
Цитата:
Грустно, но придется, видимо.
это стандартный прием. и довольно логичный)

и да, раз static метод является обычной функцией, ему видимо тоже нужно указать, что линкуется он в C стиле.

добавь extern "C" перед определением статического метода.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 15.02.2012 в 15:19.
pproger вне форума Ответить с цитированием
Старый 15.02.2012, 15:23   #5
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
это стандартный прием. и довольно логичный)
Надеялся на что-нибудь совсем простое, как с обычными функциями)
Здесь я не совсем понимаю как что сделать.
Точнее, вот это
Цитата:
которые возвращают и принимают указатель на интерфейс
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 15.02.2012, 15:30   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Granus
Цитата:
которые возвращают и принимают указатель на интерфейс
Код:
extern "C" Interface *ctor() { return new ConcreteClass(); }
extern "C" dtor(Interface *i) { delete i; }
создаешь и уничтожаешь объекты своего класса через эти функции
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 15.02.2012, 15:47   #7
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Ну да, логично, спасибо)
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическая загрузка формы из DLL grominfo Помощь студентам 1 15.11.2011 17:10
Преобразование в строчный тип данных(Ошибка не содержит статического метода "Main", подходящего для точки входа) aly-lucenko Помощь студентам 8 02.10.2011 11:36
Посоветуйте с DLL (динамическая загрузка) yasic Общие вопросы Delphi 4 18.01.2011 18:24
[DLL] Загрузка и выгрузка dll в/из чужого процесса Человек_Борща Win Api 4 28.02.2010 17:47
Динамическая загрузка DLL ImportDLL Общие вопросы C/C++ 2 12.06.2009 11:33