Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

wluc-16

Treue Seele

  • »wluc-16« ist der Autor dieses Themas

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

1

28.05.2013, 14:01

[GELÖST] WinMain aus DLL heraus durch main erstzen

Hey Leute,

ich habe ein Problem:

Ich möchte mir eine kleine Bibliothek in Form einer DLL erstellen, die mir die Fenstererstellung mit der WinAPI vereinfacht. Ich möchte aber nicht WinMain, sondern main benutzen. Ich weiß zwar, wie das in der Anwendung selbst geht:

C-/C++-Quelltext

1
#pragma comment(linker, "/ENTRY:mainCRTStartup")


Aber ich möchte dieses pragma ausführen, wenn die Bibliothek zum Hauptprogramm hinzugefügt wird.



Weiß evtl. einer, wie man das macht?

Edit: Benutze VC++ 2010.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »wluc-16« (28.05.2013, 16:40)


wluc-16

Treue Seele

  • »wluc-16« ist der Autor dieses Themas

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

2

28.05.2013, 14:27

Kann man das vllt. aus der DllMain-Funktion machen?

Edit: Geht auch nich :(

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »wluc-16« (28.05.2013, 14:39)


rnlf

Frischling

Beiträge: 85

Beruf: Softwareingenieur Raumfahrt

  • Private Nachricht senden

3

28.05.2013, 15:25

Was du da machst ist auch kein Code, der irgendwie ausgeführt wird. Es ist nur ein Hinweis an Visual Studio, dass es die Optionen, die du angibst (nämlich /ENTRY:mainCRTStartup) mit an den Linker übergibt.

Der Linker ist vereinfacht gesagt das Programm, das aus deinen ganzen fertig zu Ojektdateien übersetzen C- und C++-Dateien am Ende ein komplettes Programm macht. Der braucht einen Einstiegspunkt (engl. entry point, daher der Name der Option), mit dem er das Programm starten lassen soll.
Sobald dein Programm geladen wird (also genau dann wenn auch DLLs mit in dein Programm geladen werden) ist es zu spät dafür.

Du wirst dir etwas anderes einfallen lassen müssen, um dein Ziel zu erreichen.

wluc-16

Treue Seele

  • »wluc-16« ist der Autor dieses Themas

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

4

28.05.2013, 15:31

Okay, Danke!

Aber wie machen das denn die Bibliotheken, wie z.B. SDL, Allegro, Irrlicht, etc.?

Ich hab auch schon versucht, das im SDL- und im Irrlicht-Quellcode nachzuschauen, aber das ist so viel Code, da weiß ich gar nicht, wie ich da gezielt nach suchen kann...

wluc-16

Treue Seele

  • »wluc-16« ist der Autor dieses Themas

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

5

28.05.2013, 15:48

Habs jetzt mit einem Makro versucht:

Quellcode

1
2
#define MAIN #pragma comment(linker, "/ENTRY:mainCRTStartup") \ 
int main()


Funktioniert aber nicht, da der Compiler dann sagt, dass er das "#" nicht erwartet hat.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »wluc-16« (28.05.2013, 15:55)


rnlf

Frischling

Beiträge: 85

Beruf: Softwareingenieur Raumfahrt

  • Private Nachricht senden

6

28.05.2013, 16:12

Warum erstellst du nicht einfach von Anfang an eine Win32-Konsolenapplikation, dann kannst auch einfach main benutzen. Ich kann mir ehrlich gesagt nicht vorstellen, warum du in deinem Programm auf so komische Art und Weise nachträglich auf main umsteigen solltest. Was versprichst du dir davon?

wluc-16

Treue Seele

  • »wluc-16« ist der Autor dieses Themas

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

7

28.05.2013, 16:23

Ohhhh :D
Damit ich das jetzt richtig verstanden habe: WinMain ist eine Art Synonym für main und ist nicht unbedingt nötig für das Arbeiten mit der WinAPI?

rnlf

Frischling

Beiträge: 85

Beruf: Softwareingenieur Raumfahrt

  • Private Nachricht senden

8

28.05.2013, 16:30

Es ist kein Synonym, aber ja, du brauchst es nicht unbedingt. Der größte Unterschied ist, dass du, wenn du main benutzt, auch immer ein Konsolenfenster bekommst.
Kann sein, dass du noch ein paar Linkerflags setzen musst, wenn du im Projektwizard ein Konsolenprojekt anlegst. Da bin ich mir nicht ganz sicher, weil ich ewig nicht unter Windows programmiert habe.

wluc-16

Treue Seele

  • »wluc-16« ist der Autor dieses Themas

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

9

28.05.2013, 16:40

Man kann in den Projekteinstellungen oder als Pragma

Quellcode

1
#pragma comment(linker, "subsystem:windows") // oder "subsystem:console" setzten


Edit: Das ist Schwachsinn, wenn man das Subsystem auf "windows" setzt braucht man wieder die WinMain, Ups :whistling:

sagen, dass man das Subsystem Windows haben will.
Dann hat man ein Fenster. Bei Konsolenanwendungen ist das aber auf Console gesetzt, soviel weiß ich.



Danke :thumbsup: , dann würd ich sagen, das Thema ist gelöst!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »wluc-16« (29.05.2013, 11:32)


10

29.05.2013, 00:13

Auch, wenn das schon gelöst ist, möchte ich noch eine Methode zeigen, wie du es ohne dieses Rumfuchteln mit dem Präprozessor machst(wenn ich die Frage richtig verstanden habe :D ) :



Quellcode

1
2
3
4
5
extern int main(); //damit sagst du bescheid, dass es so eine Funktion an einer anderen Stelle gibt...
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) //Das ist die WinMain funktion, die dann normal aufgerufen wird...
{
return main(); // Der Rückgabe-Wert, ist der Rückgabe-Wert der Main-Funktion...
}


Das musst du dann zu deinem Quellcode hinzufügen und wenn du dann ein neues Projekt erstellst und dieses einbindest, dann kannst du die "normale" main-Funktion nutzen und es wird dennoch die WinMain aufgerufen :D...sry ich kann sowas schlecht erklären :D

Werbeanzeige