Lösung für "oleacc.dll"-Problem mit MSVC7 - Kompilierten Anwendungen unter W95



  • Vielleicht kennt der Eine oder Andere das Problem bereits:

    Wer eine Anwendung mit Visual C++ 7 erstellt (oder ein altes Projekt nach MSVC7 konvertiert) und sie anschliessend kompiliert, wird feststellen, dass die Anwendung nicht unter Windows 95 sowie NT4 (SP < 5 soviel ich weiss) läuft. Das äussert sich darin, dass die Anwendung beim Starten mit der Meldung "oleacc.dll nicht gefunden" abbricht.

    Dazu gibt es einen netten Workaround, solange man keine Funktionen aus dieser DLL benötigt. Dieser funktioniert wiefolgt:

    Technischer Hintergrund
    Seit MSVC6 gibt es die Möglichkeit des Verzögerten Ladens von DLLs. Das bewirkt, dass die DLL erst wirklich kurz vor dem ersten Aufruf einer Funktion die aus dieser DLL exportiert wird geladen wird.

    Da scheinbar der Linker von MSVC7 nicht mehr nur benötigte DLLs implizit lädt sondern einfach mal eine Grundausstattung an DLLs, ist es nun nötig, dass man dem Linker verbietet den Lade-Code für OLEACC.DLL an den Anwendungsstart zu stellen und ihn dazu zwingt diesen Code vor dem ersten Aufruf einer Funktion aus OLEACC.DLL zu platzieren. (Eben dieses verzögert laden.)

    Lösung Step-By-Step
    Um das verzögerte Laden von OLEACC.DLL zu bewerkstelligen, führt man folgende Schritte durch:

    • Zunächst öffnen wir die Projektoptionen
    • Anschliessend wechseln wir zu den Linkereinstellungen und wechseln in das "Eingabe"-Panel.
    • Auf der Zeile "Verzögert geladene DLLs" fügen wir OLEACC.DLL hinzu.
    • Die neuen Einstellungen speichern.
    • In der Datei "stdafx.cpp" kommt folgende Präprozessoranweisung hinzu:
    #pragma comment(lib, "delayimp.lib")
    

    Diese Zeile ist nötig, damit eine Hilfsfunktion für das verzögerte Laden gelinkt werden kann.

    • Datei speichern.

    Das wärs schon. Kompilieren, ausführen, freude haben.

    Leider scheints tatsächlich als würde MS alles daran setzen, dass zufrieden Win95 User auf ein anderes system (inkl. anderer Hardware?) migrieren müssen.

    Was mich einfach etwas wundert ist die Tatsache, dass der Linker scheinbar wirklich einfach mal ein paar DLLs lädt welche er "vermutet" zu brauchen (obwohl er sie nicht braucht).

    Ich hoffe die Anleitung hilft.

    -junix



  • Was mich einfach etwas wundert ist die Tatsache, dass der Linker scheinbar wirklich einfach mal ein paar DLLs lädt welche er "vermutet" zu brauchen (obwohl er sie nicht braucht).

    Der Linker linkt nur die zugehörige lib, in welcher drin steht, dass die dll statisch (d.h. beim Starten) geladen werden soll.
    Nur bei der lib kann er entscheiden, welche Funktionen er daraus braucht bzw. brauchen könnte.
    Da bei COM zur Entwicklungszeit nicht bekannt ist, welche Objekte bzw. Funktionen auch gebraucht werden, muss leider alles geladen werden.



  • bei mir laufen mit msvc7 erstellte winapi programme auf einem frisch installierten windows 95 ohne irgendwelche umstellungen. oder ging es bei dir um mfc programme?



  • Original erstellt von RenéG:
    Da bei COM zur Entwicklungszeit nicht bekannt ist, welche Objekte bzw. Funktionen auch gebraucht werden, muss leider alles geladen werden.

    ... bei dem Projekt bei dem ich das gebraucht habe wurde meines wissens nicht explizit COM verwendet ... und die Tatsache, dass die DLL nach dem Start der Anwendung nichtmehr benötigt wird, legt die Vermutung nahe, dass auch implizit kein COM verwendet wurde ...

    -junix

    <edit>@<95w> MFC Programme natürlich, das hier ist das MFC-Forum (-; WinAPI kannst du ja mit jedem handelsüblichen Texteditor und z.B. MingW32 auch programmieren. (-;</edit>

    [ Dieser Beitrag wurde am 10.04.2003 um 16:21 Uhr von junix editiert. ]



  • Mapped "OLEACCRC.DLL" as a data file into memory at address 0x00380001. 😮


Anmelden zum Antworten