WinMain экспортируется из DLL - PullRequest
       22

WinMain экспортируется из DLL

1 голос
/ 27 декабря 2010

Я пытаюсь скрыть функцию WinMain внутри DLL, чтобы избежать повторного ввода большей части кода.

Я экспортировал wWinMain из DLL, объявив его

extern "C" int WINAPI wWinMain( ... ) { // repetitive code here }

и использовал параметр компоновщика /EXPORT:wWinMain, но когда я пытаюсь использовать библиотеку импорта в другом проекте, я получаю ошибку

LIBCMTD.lib(wincrt0.obj) : error LNK2019: unresolved external symbol _<em>WinMain@16 referenced in function _</em>_tmainCRTStartup

Замечание Я хочу использовать интерфейс GUI , и я знаю, что это распространенная ошибка, когда вы определяете main вместо функции WinMain. Также я включил поддержку UNICODE в обоих проектах. Что мне делать?

Ответы [ 6 ]

2 голосов
/ 29 декабря 2010

Это невозможно, как есть, компоновщик может только установить точку входа для EXE в функцию, которая находится внутри EXE. Переименуйте wWinMain () в DLL в другое. Напишите wWinMain () в файле исходного кода, который будет связан с вашим EXE-файлом, просто вызовите экспортированную функцию DLL.

0 голосов
/ 08 февраля 2016
//  ...somewhere in a .cpp file within my .dll's sources...
#define WinMain WinMainOld // ...to suppress Win32 declaration of WinMain
#include <windows.h>
#undef WinMain // ...so that WinMain below is not replaced
.   .   . 
#pragma comment(linker, "/export:_WinMain@16") // ...to export it from .dll
extern "C" // ...to suppress C++ name decoration
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     PSTR pCmdLine, int nCmdShow)
{
    .   .   .
}
0 голосов
/ 01 октября 2014
EXPORT int WINAPI _WinMain_(int (*_main_)(int argc, char **argv), HINSTANCE hInst, HINSTANCE    hPrevInstance, LPSTR commandLine, int nCmdShow);
int _XMain( int argc, char **argv );

#define XMain   WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR commandLine, int nCmdShow)\
{return _WinMain_( _XMain, hInst, hPrevInstance, commandLine, nCmdShow );}  \
int _XMain

Тогда _WinMain_() звонки или расписание _XMain().

В источнике вашего приложения:

int XMain( int argc, char **argv )
{
}
0 голосов
/ 19 декабря 2012

Я нашел один способ поместить WinMain в DLL.

  • Вам нужно использовать WinMain вместо wWinMain (я не знаю почему)
  • Добавьте файл def в ваш проект и,
    добавьте EXPORTS WinMain в файл определения. Как это

    ЭКСПОРТ

    WinMain

    Из наблюдения нужно, чтобы все экспортируемые функции генерировались, а не только WinMain.

    После теста способ __declspec (dllexport) недопустим для WinMain.

  • Свяжите вашу программу с библиотекой DLL используйте # комментарий прагмы (lib, "testDll.lib") или измените настройку в проекте.
0 голосов
/ 29 декабря 2010

Если вы хотите вызвать WinMain из dll, вам нужно заменить функцию CRTWinMainStartup (_tmainCRTStartup в вашей любимой библиотеке CRT) и заставить ее вызывать экспортированный WinMain, это останавливает компоновщик, ищущий локальный WinMain, и сохраняетправильный ход программы (источник для запуска CRT должен быть в источнике crt любого компилятора)

0 голосов
/ 29 декабря 2010

Если вы используете WinMain в DLL?Разве это не DllMain?

...