2013-03-28 11 views
5

WinMain ist eine Funktion, die den Standardhaupteintrittspunkt "main" ersetzt.C++: Implementieren benutzerdefinierter Hauptfunktion

Der Benutzer kann dann seine Haupteintrittspunkt wie

definieren
int WINAPI WinMain(...) { } 


Wie geschieht diese Art der Kapselung?

Nun, wahrscheinlich irgendwann sieht es wie folgt aus:

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

Frage: Wie kann ich eine solche Verkapselung von meinem eigenen zu erreichen, die dann WinMain ruft? Hinweis: Die Bibliothek, die ich gemacht eine DLL ist, so wird es so aussehen:

// 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 
} 

Das Problem ist jedoch, dass die DLL nicht ‚wissen‘ die Main() Funktion und deshalb wirft eine ‚ungelöste externer symbol 'kompilierfehler. Wie kann ich es so einkapseln?

Antwort

3

Sie haben auf einer Signatur Ihrer benutzerdefinierte Hauptfunktion und erklärt ihn als „extern“ (extern „C“ im Fall von C++) zu entscheiden. Dann muss der Anwendungscode diese Funktion definieren und eine Verbindung mit Ihrer statischen Bibliothek herstellen, die den tatsächlichen Einstiegspunkt hat. Zum Beispiel:

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

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

Ich bekomme immer noch eine ungelöste externe, auch mit 'extern" C ". Liegt es daran, dass ich WinMain anstelle von main als inneren Einstiegspunkt nutze? – bytecode77

+0

@DevilsChild: Es ist schwer zu sagen, was Sie tun. Wenn Ihr Einstiegspunkt 'WinMain' ist, rufen Sie Ihre eigene Hauptdatei von' WinMain'. Wenn es nur 'main()' ist - rufe es von 'main()'. Lassen Sie den Code zuerst ohne Änderungen kompilieren und ändern Sie dann, was passiert. Oder stellen Sie wenigstens ein minimales vollständiges Beispiel, das Ihr Problem demonstriert ... sonst ist es schwierig zu debuggen, was Sie tun. –

+0

Offenbar ist es ein Problem mit der Include-Struktur. Ich habe hier einen sehr minimalistischen Code zusammengestellt: http://dev-ch.com/files/a8dce463-65a2-54fe-ef43-c9d4160dea95/mylibrarywithcustommain.zip Wenn ich 'ExampleClass.h' nicht einbeziehe, funktioniert es. – bytecode77

2

Der Standardname des Linker-Einstiegspunkts lautet "main". Sie können den Standard überschreiben, um mit jeder gewünschten Funktion zu beginnen.

/ENTRY (Entry-Point Symbol)

2

Eigentlich ist der eigentliche Einstiegspunkt weder Main noch WinMain. Der echte Einstiegspunkt ist einer von wWinMainCRTStartup, WinMainCRTStartup, wmainCRTStartup und mainCRTStartup. Aber sie sind nicht in Windows.h definiert, sie sind Teil des CRT. Sie können ihren Code in <VS installation folder> \ VC \ crt \ src \ crtexe.c sehen. Sie führen jeweils eine Initialisierung durch und rufen dann entweder wWinMain, WinMain, wmain oder main auf.

Wie von jemand anderem erwähnt, können Sie den Einstiegspunkt mit der Option/ENTRY überschreiben, aber Sie können immer noch keine benutzerdefinierten Parameter haben, was der Grund ist, warum Sie dies überhaupt tun möchten.

+0

Ich wusste über die MainCRTStartup Sache, aber ich kann in der Tat benutzerdefinierte Parameter verwenden. Mein Versuch ist hier: http://dev-ch.com/files/a8dce463-65a2-54fe-ef43-c9d4160dea95/mylibrarywithcustommain.zip Es funktioniert nicht wegen einiger unbekannter Include-Probleme, aber wenn Sie die ExampleClass entfernen 's, Sie werden sehen, dass es funktioniert. Das verbleibende Problem ist jetzt die Include-Struktur, die noch nicht funktioniert. – bytecode77