Absturz beim Laden einer C++/CLI Wrapper DLL nur unter XP



  • Habe mal mit DependencyWalker die DLL geprüft.

    Da wird unter XP in kernel32.dll InitializeCriticalSectionEx als fehlend angezeigt.
    Wenn ich die DLL unter Win8.1 prüfe, dann wird diese Funktion nicht als fehlend
    angezeigt.

    Habe dazu Link

    http://connect.microsoft.com/VisualStudio/feedback/details/783276/vs2012-2-v110-xp-broken-the-procedure-entry-point-initializecriticalsectionex-could-not-be-located-in-the-dynamic-link-library-kernel32-dll

    gefunden; dieses Problem ist ja fast identisch mit meinem;
    aber der Link betrifft ja VS 2012 Update 2 und ist lt. http://support.microsoft.com/kb/2835600/de
    (Abschnitt C++) seit VS 2012 Update 3 behoben;

    Dann sollte das doch auch in VS 2013 behoben sein !?
    Habe jetzt sicherheitshalber mal das VS 2013 Update 1 aufgespielt und damit alles gebuildet; aber kein Erfolg ..

    Könnte es sein, dass dieser Bug in VS 2012 (ab Update 3) gefixt ist, aber in VS 2013 Update 1 noch bzw. wieder besteht ?



  • Habe jetzt auch noch
    http://stackoverflow.com/questions/22709094/c-application-built-with-120-xp-toolset-on-windows-xp-initializecriticalsecti
    dazu gefunden.

    Habe den gesamten (eigenen) Source nach Aufruf der Funktion InitializeCriticalSectionEx durchsucht, aber nichts gefunden.



  • Unter C++ application built with 120_xp toolset on Windows XP: InitializeCriticalSectionEx could not be located in the dynamic link library KERNEL32.dll wird dieselbe Frage behandelt - lies mal die Kommentare dazu.

    Wird denn direkt bei deiner CppCli.dll die Kernel32-Funktion im Dependency Walker angemeckert oder bei einer anderen eingebundenen DLL?

    Und verwendest du denn externe DLLs?

    Edit: ok, die Seite hast du ja jetzt auch gefunden, aber meine Fragen bleiben 😉



  • Ich vermute Du hast eine DLL mit VS2010 Update 2 übersetzt. Dort war ein Fehler drin... stelle sicher, dass alles mit einer korrekten Version übersetzt wurde...



  • Habe mich jetzt mehrere Stunden damit beschäftigt, aber immer noch keine Lösung gefunden:

    Die fehlende Kernel32.dll-Funktion InitializeCriticalSectionEx wird in Kernel32.dll direkt unterhalb meiner cppcli.dll angezeigt,
    es gibt im Source-Code dieser DLL oder meinem eigenen Sourcecode, der dort eingebunden ist, aber keine InitializeCriticalSectionEx-Aufrufe.

    Meine DLL wird definitiv mit VS2013 Update 1 und Toolset "v120_xp" gebuildet.

    Selbst wenn ich testweise in der atlwinverapi.h den Zweig mit

    #if (NTDDI_VERSION >= NTDDI_VISTA) && !defined(_USING_V110_SDK71_) && !defined(_ATL_XP_TARGETING)

    auskommentiere und so sicherstelle, dass wirklich die Kompatibilitäts-Variante

    UNREFERENCED_PARAMETER(Flags);
    // ...otherwise fall back to using InitializeCriticalSectionAndSpinCount.
    return ::InitializeCriticalSectionAndSpinCount(lpCriticalSection, dwSpinCount);

    zum Tragen kommt, erscheint InitializeCriticalSectionEx in meiner cppcli.dll immer noch als fehlend.

    Wenn ich den gewrappten CPP-Source in anderem (nativem) Projekt mit v120_xp builde, dann enthält die entstehende EXE in depends KEINEN InitializeCriticalSectionEx - Eintrag,
    aber wenn ich ihn in der Wrapper-DLL builde, dann wie oben beschrieben schon.

    Ich habe alle Konfigurationseinstellungen der beiden Projekte abgeglichen, aber das Problem tritt auch mit identischen Einstellungen auf.

    Kann denn allein die Eigenschaft, dass es keine EXE, sondern eine .NET Wrapper-DLL ist, schon dazu führen, dass InitializeCriticalSectionEx aufgerufen wird ?

    Gibt es irgendwelchen Tools, mit denen ich feststellen könnte, wodurch dieser InitializeCriticalSectionEx - Aufruf generiert wird ?



  • Evtl. hilft dir die Linker Verbose-Option? Und dann im Output nach InitializeCriticalSectionEx suchen.



  • Der Tipp mit /VERBOSE-Option des Linkers hat die Ursache geklärt :
    Es ist eine statisch gelinkte LIB cryptolicensing_rad_vc2013.lib eines Fremdherstellers, die die Funktion InitializeCriticalSectionEx verwendet;
    diese LIB gibt es in Versionen für die verschiedenen VC-Versionen; die Version für VC2013 unterstützt aber anscheinend das Toolset v120_xp nicht.
    Weil das Linken dieser LIB über ein pragma im include-File gesteuert wird und die LIB deshalb nicht explizit im Projekt steht, war sie mir bisher bei der Suche durch die Lappen gegangen ..
    Jedenfalls starten meine EXE wieder korrekt, wenn ich testweise die Funktionalität und den LIB-Import aus dem Projekt entferne.

    Habe eine Support-Anfrage an den Hersteller gestellt.

    Vielen Dank Th69 und Jochen Kalmbach für Eure Tipps.



  • Hallo,

    schön, daß du jetzt die Fehlerquelle gefunden hast. 👍
    Und auch, daß du so detailiert Feedback gegeben hast, denn dann ist das für mich als Helfer auch anspornend, dir weiterhelfen zu wollen. 😉

    Dann hoffe ich, daß deine Anfrage bei dem Fremdhersteller auch zügig bearbeitet wird.



  • Nur der Vollständigkeit halber:
    Ich habe heute vom Hersteller eine mit "v120_xp" compilierte LIB zum Testen bekommen, und mit dieser ist das Problem gelöst.

    Vielen Dank nochmals für die Tipps 🙂



  • 👍


Anmelden zum Antworten