2013-03-28 17 views
5

WinMain to funkcja, która "zastępuje" domyślny główny punkt wejścia "main".C++: Implementuj niestandardową funkcję główną

Użytkownik może określić swój główny punkt wejścia jak

int WINAPI WinMain(...) { } 


Jak to rodzaj enkapsulacji zrobić?

Cóż, najprawdopodobniej, w pewnym momencie wygląda to tak:

int main() // This must be defined somewhere in windows.h 
{ 
    return WinMain(...); 
} 

Pytanie: W jaki sposób można osiągnąć taki hermetyzację moje własne, które następnie wywołuje WinMain? Uwaga: Biblioteka które zrobiłem to DLL, tak będzie wyglądać następująco:

// This is the minimal code for the application which uses 'MyLibrary' 
#pragma comment(lib, "MyLibrary.lib") 
include "MyLibrary.h" 

void Main(MyCustomParameter *params) 
{ 
    // Write user code here 
} 

Problem jednak znaczy, że DLL nie „wiem” funkcję Main() i dlatego rzuca „nierozwiązany symbol zewnętrzny "błąd kompilacji. Więc jak mogę to hermetyzować?

Odpowiedz

3

Musisz zdecydować na podpisanie niestandardowej funkcji głównej i zadeklarować ją jako „zewnętrzny” (extern „C” w przypadku C++). Następnie kod aplikacji będzie musiał zdefiniować tę funkcję i link do twojej biblioteki statycznej, która ma rzeczywisty punkt wejścia _main. Na przykład:

extern "C" int my_main(int argc, char *argv[]); 

int main(int argc, char *argv[]) 
{ 
    return my_main(argc, argv); 
} 
+0

Nadal mam nierozwiązany zewnętrzny, nawet z 'extern" C "'. Czy to dlatego, że używam WinMain jako wewnętrznego punktu wejścia zamiast głównego tak jak Ty? – bytecode77

+0

@DevilsChild: Trudno powiedzieć, co robisz. Jeśli twoim punktem wejścia jest 'WinMain' - wywołaj swój własny główny z' WinMain'. Jeśli jest to po prostu 'main()' - wywołaj go z 'main()'. Najpierw zmodyfikuj kod, aby skompilować zmiany bez zmian, a następnie wprowadź zmiany i zobacz, co łamie. Lub przynajmniej postaw minimalny kompletny przykład demonstrujący twój problem ... w przeciwnym razie trudno jest debugować to, co robisz. –

+0

Wygląda na to, że jest problem ze strukturą dołączania. Poniżej zamieszczam kilka bardzo minimalistycznych kodów: http://dev-ch.com/files/a8dce463-65a2-54fe-ef43-c9d4160dea95/mylibrarywithcustommain.zip Kiedy nie dodaję "ExampleClass.h", to działa. – bytecode77

2

W rzeczywistości prawdziwy punkt wejścia nie jest ani głównym, ani WinMain. Prawdziwym punktem wejścia jest wWinMainCRTStartup, WinMainCRTStartup, wmainCRTStartup i mainCRTStartup. Ale nie są zdefiniowane w Windows.h, są częścią CRT. Możesz zobaczyć ich kod w <VS installation folder> \ VC \ crt \ src \ crtexe.c. Każda z nich wykonuje inicjalizację, a następnie wywołuje jeden z odpowiednio: wWinMain, WinMain, wmain i main.

Jak wspomniano przez kogoś innego, możesz zastąpić punkt wejścia przełącznikiem/ENTRY, ale nadal nie możesz mieć parametrów niestandardowych, co jest głównym powodem, dla którego chcesz to zrobić w pierwszej kolejności.

+0

Wiedziałem o rzeczy MainCRTStartup, ale rzeczywiście mogę używać parametrów niestandardowych. Moja próba jest tutaj: http://dev-ch.com/files/a8dce463-65a2-54fe-ef43-c9d4160dea95/mylibrarywithcustommain.zip To nie działa z powodu niektórych nieznanych problemów z włączeniem, ale po usunięciu 'ExampleClass 'es, zobaczysz, że to działa. Pozostałym problemem jest teraz struktura włączeń, która jeszcze nie działa. – bytecode77

Powiązane problemy