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

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

11

06.04.2010, 18:50

Wenn das Programm (nur) den neuen Namen kennt und die DLL richtig läd schon...
Aber ist ja auch egal, wie man das macht ist sowieso abhängig von der Anwendung und persönlichen Vorlieben. Wenn man z.B. die Instanz sehr oft braucht und die DLL z.B. eigene Fenster und -klassen erstellt ist (meiner Meinung nach) eine globale Speicherung viel besser.

EDIT: zu spät :(
Signaturen werden überbewertet

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

12

06.04.2010, 19:33

Wenn das Programm (nur) den neuen Namen kennt und die DLL richtig läd schon...
Welche Möglichkeit kennst du denn sonst noch eine DLL zu laden? Selbst beim loadtime dynamic linking hat ein Umbenennen zur Folge das die DLL nicht geladen werden kann. Also, keine Gefahr diesbezüglich vorhanden.
@D13_Dreinig

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

13

06.04.2010, 20:27

Kann es sein, dass wir ein wenig aneinander vorbei reden?

Was ich meine:
Wenn eine DLL unter einem neuen Namen neu erstellt wird, und in dieser DLL GetModuleHandle (mehrmals) verwendet wurde, und dann mit dieser DLL ein neues Programm entwickelt wird, die Verwendung von GetModuleHandle aber vergessen wurde, also auch der entsprechende Code nicht geändert wurde (dem Compiler ist das ja egal), dann lässt sich die DLL trotzdem laden (und von diesem Ausgangspunkt bin ich ausgegangen, du aber anscheinend nicht...). Das kann unter Umständen zu schwer auffindbaren Fehlern führen. Deshalb ist es doch von Vorteil, die Instanz gleich global zu speichern. Globale Variablen sind zwar auch nicht gerade ungefährlich, aber in diesem Fall sollte daraus kein Nachteil entstehen und globale Variablen wurden schließlich nicht erfunden um generell gemieden zu werden. Außerdem ist das auch (wie oben bereits gesagt) deutlich leichter, falls die Instanz oft verwendet wird.
(Hoffe du hat jetzt wenigstens meinen Ausgangspunkt verstanden ;) )

Wahrscheinlich hast du meine Aussage "Wenn sich der Name der DLL ändert" so gedeutet, das dieser nachträglich einfach verändert wird... war auch schlecht ausgedrückt. :whistling:

Aber wie gesagt, was man verwendet ist eine Sache von persönlichen Vorlieben und dem speziellen Anwendungsfall, weshalb die Diskussion hier nicht weiterhilft. Der Fragesteller hat die beiden Möglichkeiten erfahren und kann sich nun selbst aussuchen welche er verwenden möchte; anhand des konkreten Falles in dem er es verwendet und anhand seiner persönlichen Vorlieben. Eine weitere Diskussion hier, bei der wir vermutlich nur noch mehr aneinander vorbeireden werden, und bei der wir wohl kaum zu einer "besten" Lösung kommen werden hilft weder ihm noch uns weiter deshalb lassen wir es besser.
Signaturen werden überbewertet

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

14

06.04.2010, 20:51

Achso, das wäre in der Tat unschön. Allerdings sollte das in seriösem Code nicht vorkommen! ;)
@D13_Dreinig

C--

Alter Hase

Beiträge: 465

Beruf: Schüler

  • Private Nachricht senden

15

07.04.2010, 11:15

Mein Vorschlag wäre noch, ein Makro zu definierern:

C-/C++-Quelltext

1
#define DLL_HANDLE GetModuleHandle(TEXT("ModulName"))


Dann braucht man bei einer Namensänderung nur dieses Makro zu ändern ;)
Ich spreche: C/C++, C++/CLI C#, VBA, VB.NET, Delphi, (HTML, Javascript(bisschen))
------------------------------------------------------------
Hier steht eventuell schon in ein paar Monaten der Link zu meiner Homepage!

return 0;
;)

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

16

07.04.2010, 13:44

Nunja, diese Möglichkeit ist meiner Meinung nach nicht so gut. Wenn man ja daran denkt, dass man das abändern muss, dann gibt es ja noch so feine Dinge wie das Suchen und Ersetzen, mit denen man in einem halbwegs ordentlichem Editor mit 2-3 Mausklicks alle Vorkommen von GetModuleHandle ersetzen kann. Außerdem:

Zitat

Makros sind in C sehr wichtig. Sie sind aber in C++ weniger nützlich. Die wichtigste Regel bei Makros ist: Benutze keine, es sei denn, es ist unabdingbar. Fast jedes Makro demonstriert eine Schwäche in der Programmiersprache, im Programm oder beim Programmierer

Quelle: Bjarne Stroustrup Die C++ Programmiersprache 4. Auflage Kapitel 7.8 Seite 171

Dann ja schon eher den Namen global und konstant speichern und für GetModuleHandle verwenden (was in meinen Augen aber völliger Schwachsinn ist, da man dadurch keinen, von mir erkennbaren Vorteil hat).
Aber naja auch eine Möglichkeit und wenn sie dem Fragesteller (falls er das hier überhaupt noch liest :) ) gefällt kann er sie ja auch benutzen. Alles hat Vor- und Nachteile. Wie bereits gesagt: es gibt nicht DIE Lösung (das ist ja schließlich das gute an C++ es zwingt einem nicht eine bestimmte Denkweise auf)
Signaturen werden überbewertet

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

17

07.04.2010, 18:47

Ich würde dazu raten sich die HINSTANCE aus der DllMain global zu merken. Ein Prozess könnte z.B. alle *.dll Dateien aus einem bestimmten Ordner laden die dann zuvor auch irgendwie umbenannt werden können (ich denke z.B. an ein PlugIn System, da muss oft nichtmal die Dateiendung auf .dll lauten). Es gibt also jedenfalls keine generelle Garantie dass die dll immer den selben Dateinamen hat. Wenn man diese Annahme in der dll trifft so bindet man die Funktionalität der dll an ein bestimmtes Verhalten des Prozesses der die dll verwendet. Imo eine sehr unsaubere Lösung.

Werbeanzeige