Netapi32 ohne msvcrt möglich?



  • Hallo zusammen,

    ich habe ein Problem mit der Netapi32.dll:

    Ich möchte in einem Projekt Netzwerkfunktionalität unter Windows nutzen ohne jegliche Verwendung der dynamischen Version der CRT, d.h. jede DLL bindet die statische CRT ein (Compileroption unter VS2005 /MT).

    Die Netapi32.dll, die unter W2K/NT die grundlegende API für Netzwerk darstellt, setzt auf der MSVCRT.dll auf, nutzt also die dynamische Version der C-Runtime Library (CRT). Die Folge ist, dass es zu einer Mischung von CRTs kommt, was in der Regel zu schweren Seiteneffekten führt, siehe auch der Artikel:

    http://msdn2.microsoft.com/en-us/library/ms235460(VS.80).aspx

    Meine Frage: Ist von Seiten der Windows-Architekten überhaupt eine Möglichkeit vorgesehn, die Netapi32.dll "statisch" zu nutzen? Gibt es hierzu eine Alternative?
    QT (Network) z.B. setzt auch auf der netapi32 auf. Gibt es überhaupt eine API, Framework, etc. der die statische CRT (libcmt.lib) nutzt ??

    Für eine Antwort wäre ich sehr dankbar, Grüsse


  • Mod

    Wieso soll das zu Seiteneffekten führen wenn eine DLL diese CRT verwendet und Du eine andere?

    Solange jede Software eben eine CRT verwendet beisst sich da gar nichts!



  • Hi Martin,

    da bin ich anderer Meinung. In der Tat rät Microsoft in der MSDN von einem Mischen der RTLs ab:

    Caution Do not mix static and dynamic versions of the run-time libraries. Having more than one copy of the run-time libraries in a process can cause problems, because static data in one copy is not shared with the other copy. The linker prevents you from linking with both static and dynamic versions within one .exe file, but you can still end up with two (or more) copies of the run-time libraries. For example, a dynamic-link library linked with the static (non-DLL) versions of the run-time libraries can cause problems when used with an .exe file that was linked with the dynamic (DLL) version of the run-time libraries. (You should also avoid mixing the debug and non-debug versions of the libraries in one process.)

    (aus: http://msdn2.microsoft.com/en-us/library/2kzt1wy3(VS.71).aspx )

    Vielleicht könntest Du dies noch etwas näher erläutern?
    Gruss


  • Mod

    Das betrifft Dein Projekt. Du sollst nicht innerhalb eines Modules mit mehreren Version der CRT herumspielen. Das ist doch auch logisch...
    Das betrifft doch nicht unabhängige Module!

    Das Modul Netapi32 benutzt seine CRT, Du Deine und das ist OK so.

    Du bekommst ja auch nicht einen Zeiger aus Netapi32 den Du mit Deiner CRT freigibst, oder ein Filehandle oder sonst was.



  • Hi Martin,

    danke nochmals für Deine Anregungen. Die Seiteneffekte, die obiger Artikel beschreibt, traten auch bei unserem Projekt auf (Laufzeitfehler der Applikation: Acess Violation --> RTlHeapInvalidate)

    Nach einigem Brainstorming haben wir die Lösung gefunden: Das Problem liegt in der Tat nicht im Mischen der CRTs, sondern in der Speicherverwaltung von CRT-Objekten über DLL- Grenzen hinaus. Dies tritt insbesondere dann zu Tage, wenn jede DLL ihre eigene Instanz der CRT bereitstellt.

    Besten Dank und Gruss


  • Mod

    Genau das ist es! Jede Speicherallokation muss eben im selben Modul mit der entsprechenden selben CRT wieder freigegeben werden!
    Hier wird so viel Schindluder betrieben in DLLs weil die Leute einfach CString oder std::string als Rückgabewerte in DLLs verwenden!

    Diese Regel ist sol alt wie die C Compiler bei MS.
    Such mal in Deiner MSDN nach dem Arikel Q190799. Online schient er nicht verfügbar zu sein.

    Nur als Kopie:
    http://www.kbalertz.com/190799/Potential.Errors.Passing.Objects.Across.Boundaries.aspx


Log in to reply