Инкапсулировать цикл сообщений Windows в DLL - PullRequest
4 голосов
/ 21 июля 2009

Я хотел бы иметь DLL с кодом создания и управления окнами, чтобы разработчик мог просто добавить именованный заголовок main.h и загрузить DLL, чтобы иметь возможность создавать окно.

#include "dllheader.h" 

void user_main();

main = user_main; // attach user main to the dll callback

int user_main() {
    Window *w = new Window();
}

на стороне DLL код должен выглядеть как

void (*main)() = NULL;

int WinMain(...) {
   if(main)
       main(); // call the user defined funcion
   while(!done) {
       if(messageWaiting()) {
           processMessage();
       }
   }

}

Почему? потому что я хочу развернуть оболочку окна и избежать, чтобы пользователь записывал точку входа WinMain. Но у проекта DLL есть основная библиотека DLL и проект win32, который использует жалобу DLL, если компоновщик не находит точку входа winMain.

Есть ли известное решение для такого рода аранжировки?

Ответы [ 2 ]

3 голосов
/ 21 июля 2009

Каждое приложение Win32 должно иметь точку входа (обычно WinMain). Таким образом, вы не можете поместить точку входа в DLL, потому что она не является частью EXE. Однако точка входа может находиться в статически связанной библиотеке. Когда статическая библиотека становится связанной, точка входа становится частью EXE.

Но я предлагаю избежать всей этой сложности. Просто заставьте пользователей вашей DLL вызывать что-то вроде этого:

int WinMain( HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow )
{
    return WrapperDllMain( hInstance, hPrev, lpCmdLine, nCmdShow, &user_main );
}

Код прост и легок в написании. Это не так много усилий со стороны пользователей DLL. Вы имеете полный контроль над циклом сообщений (и всем временем жизни процесса).

1 голос
/ 21 июля 2009

Вы не можете реализовать точку входа приложения WinMain () внутри отдельной DLL. Приложение должно реализовывать свои собственные точки входа, иначе компоновщик будет жаловаться, как вы уже обнаружили. Точка входа приложения может вызывать функции, которые находятся в DLL, например:

--- app ---

#include "dllheader.h" 

int user_main()
{
  ...
}

int WinMain(...)
{
  return dll_main(&user_main);
}


--- dll ---

int dll_main(void (*user_main)())
{
  if(user_main)
    user_main(); // call the user defined funcion

  while(!done)
  {
    if(messageWaiting())
    {
      processMessage();
    }
  }
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...