Re: DLL Problem Laufzeitfehler RTL (Manifest?)



Hallo Andreas!

und schönen Tag. Bei der Umstellung von MS Visual Studio 2003 auf 2005 habe ich große Probleme meine alte DLL wieder zum Laufen zu bringen.

Zu aller Anfang: Linke Statisch gegen die CRT!
Oder benötigst Du dynamisches Linken?

Ich arbeite mit dem numerischen Simulationspaket ABAQUS v6.6-1, das nur Benutzerschnittstellen zu FORTRAN bereitstellt (Intel FORTRAN 8.1). Da ich aber mit C++ arbeite habe ich eine DLL mit MS Visual C++ geschrieben die von einem sehr kleinen FORTRAN Programm aufgerufen bzw. genutzt wird. Das FORTRAN Programm dient nur als Zwischenebene zum eigentlichen Aufruf meiner C++ Klassenbibliothek. In de alten Version mit ABAQUS 6.4 und MS Visual Studio 2003 sowie dem Intel FORTRAN Compiler 6.5 funktionierte das auch wunderbar.
Nun noch kurz wie der ganze Linkprozess funktioniert. Dazu wird ABAQUS mit einigen Parametern für die Benutzersubroutine von der Kommandozeile aufgerufen. Dabei generiert ABAQUS in einem temporären Verzeichnis eine DLL die dann ABAQUS in Form des Programms standard.exe selbst benutzt und in der die FORTRAN Subroutine enthalten ist. Nun erfolgt aber in dieser FORTRAN Subroutine ein weitere Aufruf zum Einstiegspunkt in meine C++ Klassenbibliothek die in einer anderen weitern DLL enthalten ist, welche ich zuvor im MSVC++ 2005 geschrieben und erzeugt habe. Nun passiert folgendes:
Ich erhalte den Fehler: „standard.exe – Komponente nicht gefunden“ Die Anwendung konnte nicht gestartet werden, weil MSVCR80.dll nicht gefunden wurde. Neuinstallation der Anwendung könnte das Problem beheben.

Hat Deine Dll ein eingebettetes Manifest? Oder ist es extern.
Schalte das Projekt so, dass dieses Manifest eingebettet wird.
Wenn die DLL explizit geladen wird, dann werden externe Manifeste ignoriert!
Siehe mein Blog:
http://blog.m-ri.de/index.php/2007/02/14/notwendigkeit-von-manifesten-fur-dlls-mit-vc-2005/


In der alten lauffähigen Version habe ich einfach die Dateien „msvcr80.dll“ und andere wichtige DLLs im Suchpfad von PATH eingetragen, was immer funktioniert hat.

Nun brauchst Du ein Manifest, was Dir die entsprechende Bindung garantiert!

Mache ich dies (PATH=%PATH%;%VCINSTALLDIR%\redist\x86\Microsoft.VC80.CRT) in der neuen Version so bekomme ich dann folgende Fehlermeldung:
Microsoft Visual C++ Runtime Library: Runtime Error! Program: F:\Software\Science\ABAQUS\6.6-1\exec\standard.exe
R6034
An application has made an attempt to load the C runtime library incorrectly. Please contact the application’s support team for more information.

Das ist Quark! Du brauchst ein vernünftiges korrektes Manifest.

Als letztes noch eine kleine Angabe zur Generierung der DLL im temporären Verzeichnis beim Aufruf von ABAQUS. Dort wird eine DLL mit dem Namen standardU.dll erzeugt mit der Manifestdatei standardU.dll.manifest die folgendes enthält:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50727.762' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
</assembly>

Sorge dafür, dass dieses Manifest embedded ist.

Ich wäre sehr glücklich wenn mir von Euch jemand weiterhelfen könnte, da ich schon länger suche. Am wichtigsten wäre mir, was muss ich tun um den Fehler zu beseitigen, da die Zeit leider schon etwas drängt. Auch eine kurze Erklärung warum der Fehler auftritt bzw. ein Link wo die Problematik genauer erläutert wird wäre super, damit ich beim nächsten Mal weis was ich bzw. warum ich was falsch gemacht habe.

Noch einmal meine Empfehlung um der Manifest Hölle zu entgehen: Linke statisch gegen die CRT wenn dies möglich ist!

--
Martin Richter [MVP] WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written
program is its own hell!" The Tao of Programming
FAQ: http://www.mpdvc.de Samples: http://www.codeproject.com
.