Benutzer mit den meisten Antworten
occi11.dll (Oracle) in VS2010 Projekt einbinden (veraltete Version von msvcrt.dll)

Frage
-
Hallo,
ich habe einen gleichnamigen Thread schon im VisualStudio Forum gestartet, aber bin zu dem Schluss gekommen, dass ich hier wahrscheinlich besser aufgehoben bin.
Das Problem ist das folgende: die aktuellsten dll's von Oracle wurden mit VisualStudio2008 kompilliert und somit gegen msvcr90.dll u.a. gelinkt. VisualStudio2010 arbeitet ja mit dem .NET-Framework 4, in dem eine neue Version, msvcr100.dll, die alte ersetzt.
Meine Frage ist jetzt,wie ich es schaffe, für die occi11.dll die msvcr90.dll zu verknüpfen, so dass das Programm bei Ausführung nicht auf die neue msvcr100.dll zugreift.
Bisher habe ich folgende Schritte unternommen:
- den Ordner mit den alten msv*.dll in Projekteigenschaften->C/C++->Allgemein->Zusätzliche Includeverzeichnisse hinzugefügt
- unter Projekteigenschaften->Linker->Manifestdatei->Zusätzliche Manifestabhängigkeiten habe ich die Parameter aus assemblyIdentity aus der Microsoft.VC90.CRT.manifest eingetragen:
type='win32' name='Microsoft.VC90.DebugCRT' version='9.0.30729.1' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'
so dass die Projectdll.intermediate.manifest jetzt so aussieht:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level='asInvoker' uiAccess='false' />
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.30729.1' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
</assembly>So bekomme ich nicht mehr Fehler R6034 (wie vorher), dass Programm stürtzt aber ab, so bald occi.dll oder eine andere dll des Oracle-Pakets auf Funktionen von msvcr zugreift. Denn zur Laufzeit wird in die msvcr100.dll gesprungen und nicht in msvcr90.dll.
Kann mir jemand sagen, was ich falsch mache?
Vielen Dank im Voraus,
Harald
Antworten
-
Das Problem ist das folgende: die aktuellsten dll's von Oracle wurden mit VisualStudio2008 kompilliert und somit gegen msvcr90.dll u.a. gelinkt.
VisualStudio2010 arbeitet ja mit dem .NET-Framework 4, in dem eine neue Version, msvcr100.dll, die alte ersetzt.Das .NET Framework hat nix mit der CRT Version zu tun...
Meine Frage ist jetzt,wie ich es schaffe, für die occi11.dll die msvcr90.dll zu verknüpfen,
so dass das Programm bei Ausführung nicht auf die neue msvcr100.dll zugreift.Installiere bei Dir VS2008 und stelle dann in Deinem VS2010-Projekt als als Toolset vc90 ein:
Project|Properties|Configuration Properties|General|Platform Toolset: v90
Jochen Kalmbach (MVP VC++)- Als Antwort markiert Harald Klingel Montag, 17. Januar 2011 15:33
-
Dann musst Du die mal ausskommentieren um zu schauen ob es dann geht...
Es wird halt jetzt das komplette Toolset von VS20087 verwendet! Du verwendest jetzt nur noch die IDE von VS2010!!!!
Alternativ könntest Du auch alle aufrufe zu dieser LIB/DLL in einen passenden Activation-Context packen; dann würde es auch gehen...
Jochen Kalmbach (MVP VC++)- Als Antwort markiert Harald Klingel Montag, 17. Januar 2011 15:33
-
Das Problem war, dass ich nur VS2008 Express habe, aber eine Vollversion von VS2005 u 2010.
Ich habe in der rc-Datei die afxres.h durch winres.h ersetzt.
Ich habe die winres.h von VS2010 kopiert und unter dem gleichen Pfad in Programm/Microsoft Visual Studio 9.0 eingefügt. Jetzt geht es.
Wer nur eine winres.h aus VS2005 hat, muss nur die Zeile
#define WINVER 0x0500 // default to Windows 4.0 anpassen, z.B. auf #define WINVER 0x0501 // default to Windows XP
- Als Antwort markiert Harald Klingel Montag, 17. Januar 2011 15:33
Alle Antworten
-
Das Problem ist das folgende: die aktuellsten dll's von Oracle wurden mit VisualStudio2008 kompilliert und somit gegen msvcr90.dll u.a. gelinkt.
VisualStudio2010 arbeitet ja mit dem .NET-Framework 4, in dem eine neue Version, msvcr100.dll, die alte ersetzt.Das .NET Framework hat nix mit der CRT Version zu tun...
Meine Frage ist jetzt,wie ich es schaffe, für die occi11.dll die msvcr90.dll zu verknüpfen,
so dass das Programm bei Ausführung nicht auf die neue msvcr100.dll zugreift.Installiere bei Dir VS2008 und stelle dann in Deinem VS2010-Projekt als als Toolset vc90 ein:
Project|Properties|Configuration Properties|General|Platform Toolset: v90
Jochen Kalmbach (MVP VC++)- Als Antwort markiert Harald Klingel Montag, 17. Januar 2011 15:33
-
Dann musst Du die mal ausskommentieren um zu schauen ob es dann geht...
Es wird halt jetzt das komplette Toolset von VS20087 verwendet! Du verwendest jetzt nur noch die IDE von VS2010!!!!
Alternativ könntest Du auch alle aufrufe zu dieser LIB/DLL in einen passenden Activation-Context packen; dann würde es auch gehen...
Jochen Kalmbach (MVP VC++)- Als Antwort markiert Harald Klingel Montag, 17. Januar 2011 15:33
-
Das Problem war, dass ich nur VS2008 Express habe, aber eine Vollversion von VS2005 u 2010.
Ich habe in der rc-Datei die afxres.h durch winres.h ersetzt.
Ich habe die winres.h von VS2010 kopiert und unter dem gleichen Pfad in Programm/Microsoft Visual Studio 9.0 eingefügt. Jetzt geht es.
Wer nur eine winres.h aus VS2005 hat, muss nur die Zeile
#define WINVER 0x0500 // default to Windows 4.0 anpassen, z.B. auf #define WINVER 0x0501 // default to Windows XP
- Als Antwort markiert Harald Klingel Montag, 17. Januar 2011 15:33
-
> Das Problem war, dass ich nur VS2008 Express habe, aber eine Vollversion von VS2005 u 2010.
Das geht natürlich nicht!
Du brauchst auch die VS2008 Vollversion!
Die bekommst Du aber wenn Du eine VS2010 Vollversion hast!
Dazu musst Du Dich aber kurz an den MS Support wenden; oder an den Verkäufer der VS2010 Version!
Jochen Kalmbach (MVP VC++) -
Nun habe ich das Problem erweitert und habe damit wieder das alte Problem. So sieht der Aufbau aus:
Ich habe ein Projekt 'Database', in dem ich die occi11.dll benutze und verwende dort das Toolset v90. Ich baue damit die database.dll.
Diese database.dll wird durch ein zweites Projekt eingebunden, dass allerdings Toolset v100 benutzt. Zur Laufzeit wird jetzt wieder auf die falsche Version von msvcrt.dll zugegriffen und das Program fliegt weg.
Ist es möglich, die database.dll in vs100 Projekte einzubinden und wie geht das oder müssen jetzt alle Projekte, die database.dll verwenden auf vs90 umgestellt werden?
-
> in dem ich die occi11.dll benutze
Du musst die Doku zu occi11.dll lesen.
Wenn hier eine harte Abhängigkeit zur v90 besteht,
und diese Abhängigkeit sich auch in der Schnittstelle der DLL auswirkt, so bleibt Dir nichts anderes übrig als v90 zu verwenden!
ALternativ kannst Du eine eigene Wrapper-DLL bauen, die v90 verwendet und die Abhängigkeit zur CRT nicht mehr in der Schnittstelle enthalten ist. Dann kannst Du diese DLL in einer v100 Applikation verwenden.
Jochen Kalmbach (MVP VC++) -
Ich habe noch eine andere Lösung gefunden: Ich benutze jetzt QOCIDriver aus QT4.7.1. Dieser basiert auf der oci.dll, die in C geschrieben ist. Wenn ich QOCIDriver in dem 'Database'-Projekt verwende, kann ich als Plattformtoolset v100 benutzen und habe das Problem umgangen.
Ich werde mir trotzdem noch den Ansatz mit einer eigenen Wrapper-DLL anschauen, wer weiss, welche zukünftigen third-party-dlls ich noch brauche.
Herzlichen Dank noch Mal an Jochen und Martin!
-
> Ich habe schon die Projekteinstellung 'Verwendung von MFC' auf 'MFC in einer statischen Bibliothek verwenden' gestellt, leider ohne Erfolg. Ist es das, was Du meinst?
Nein! Siehe: http://blog.kalmbach-software.de/de/2008/03/05/wie-man-statisch-gegen-die-c-runtime-crt-linkt/
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de