Войти

Показать полную графическую версию : Visual C++ 6.0: Вопрос по DLL...


DANTIST
20-06-2003, 20:28
Нужно сделать программу, которая будет искать в определенной директории все DLL-ки и
выводить их список. А потом загружать выбранную.
В этих DLL должны быть маленькие игры.
При компиляции главной программы не известно сколько будет этих DLL и какие у них будут имена.

Реально ли вообще загрузить функцию(класс) из DLL, о которой при компиляции ничего не известно?
Все эти DLL например могут экспортировать одну функцию, которая будет рисовать окно игры.

Можно ли сделать тоже самое, только с MFC. То есть, чтобы не вручную рисовать окно, а создавать с
использованием компонентов и классов MFC?

vasketsov
21-06-2003, 19:17
DANTIST
Реально ли вообще загрузить функцию(класс) из DLL, о которой при компиляции ничего не известно?

Загрузить функцию(класс) - это как?
Функцию обычно выполняют.
Описание класса обычно используют для создания его экземпляров.

В любом случае, если известен прототип, по которому будет происходить поиск файлов/функций/классов, можно задекларировать это еще до написания первой такой DLL.

Например:

p = GetProcAddress(hDll, 'MySuperPuperFunction');
PMYSUPERPUPERPROTOTYPE(p)(param1, param2,param3,...);

Это если не хочется с интерфейсами связываться и аналогичными решениями.

DANTIST
22-06-2003, 02:44
Делаю так...

- В DLL пишу:
__declspec(dllexport) void MyMessage(void)
{
   MessageBox(NULL, "This Message from DLL!", "!!!", MB_OK);
}

- В главной программе пишу:
__declspec(dllimport) void MyMessage(void);
HINSTANCE hDll;
FARPROC MyProcAddr;
if (( hDll = LoadLibrary("MyDll.dll")) != NULL)
{
  MyProcAddr = GetProcAddress(hDll, "MyMessage");
  if (MyProcAddr != NULL)
     (MyProcAddr)();
  else
      MessageBox(NULL, "MyMessage address not given!", "Error!", MB_OK);
}
else
{
  MessageBox(NULL, "MyDll.dll not found!", "Error!", MB_OK);
}
FreeLibrary(hDll);

Что не так? Почему не определяется адрес функции?

P.S. Я не подключал .lib файл.

vasketsov
22-06-2003, 13:56
DANTIST
Скорее всего некорректно собираешь MyDll.dll.
Depends-ом погляди, что и как там экспортируется из нее в итоге. Если будут лишние сивмолы в имени - поищи mangling на rsdn.ru




© OSzone.net 2001-2012