Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: MFC (Visual C++) ::  Sehr spezielles Problem - (DLL + Manifest)  
Gehen Sie zu Seite 1, 2, 3  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
nep
Autor

Benutzerprofil
Anmeldungsdatum: 20.12.2002
Beiträge: 913
Beitrag nep Autor 12:03:12 15.05.2007   Titel:   Sehr spezielles Problem - (DLL + Manifest)            Zitieren

Hi,
also hier sind ja auch einige MVPs unterwegs (Jochen Kalmbach und Martin Richter)... ich hoffe mal dass mir insbesondere einer von euch irgendwie weiter helfen kann, da das doch etwas sehr speziell ist.
Und zwar geht es grob gesagt erst mal darum, dass ich die (MFC)Runtime-DLLs selbst weitergeben will und nicht die verwenden will, welche schon auf dem Ziel-System installiert sind. Dazu gibts auch einen Artikel, welcher glaube auch auf eine Anregung von Jochen zurückgeht(?). Da wird halt beschrieben wie man die Manifest-Datei(en) ändern muss, usw...
Zu finden hier:
http://mcblogs.craalse.de/sku?title=visual_studio_2005_runtimes_part_2_sich&more=1&c=1&tb=1&pb=1

Bei normalen MFC-Apps wo eine .exe erzeugt wird funktioniert das auch wunderbar.
Das was ich erstelle ist aber keine MFC-Applikation, sondern ein DirectShow-Filter. Vom Anwendungstyp her ist das zunächst nichts weiter als eine normale Win32-DLL bzw. ein COM-Objekt. In diesem Filter benutze ich jedoch auch ein paar MFC-Dinge, so dass ich somit auch Abhängigkeiten auf MFC-Bibliotheken habe. Das Problem ist, dass sich mein Filter auf Entwickler-PCs wunderbar registrieren (mit regsvr32) lässt, auf den Ziel-Systemen jedoch nicht. Da kommt dann immer eine Fehlermeldung, dass LoadLibrary meinen Filter nicht laden konnte. Ich habe mittlerweile die Bibliothek bestimmt an der das liegt, das ist nämlich die MFC80.DLL. Wenn mein Filter darauf keine Abhängigkeit hat funktioniert das registrieren einwandfrei. Wird wohl daran liegen, dass das unterschiedliche Versionen sind (Entwickler-PC <-> Ziel-PC).
Wenn ich jetzt allerdings wie im Artikel beschrieben diese Schritte genauso ausführe, so klappt das leider trotzdem nicht. Ich kann den Filter nicht nal mehr auf meinem eigenen PC registrieren. Da kommt eine Fehlermeldung, wonach eine C-Runtime nicht geladen werden kann. Und wenn ich mir die Abhängigkeiten im Dependency-Walker anschaue, dann sind da auf einmal ganz komische Pfade zu den DLLs drinen, die ich gar nicht angegeben habe... Wird wohl irgendwie damit zusammenhängen, dass das halt keine normale MFC-Applikation ist... aber irgendwie muss man doch trotzdem angeben können, dass der Filter die DLL nehmen soll die ich mitgebe, anstatt immer im WinSxS Ordner zu suchen?
Wenn das mit der Manifest-Datei nicht möglich ist... hätte ich noch andere Möglichkeiten, z.B. evtl mit LoadLibrary oder so? Wobei LoadLibrary ja auch nicht so prickelnd sein soll...

Achja... wenn ich in den Projekt-Einstellungen angebe, dass er die MFC statisch linken soll dann bringt das auch nichts. Die Abhängigkeiten sind natürlich trotzdem noch da.

Wär super wenn mir da jemand irgendwie weiterhelfen könnte...
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 15337
Beitrag Martin Richter Moderator 13:14:40 15.05.2007   Titel:              Zitieren

Lassen wir erstmal den ganzen Manifest-Kram beiseite und klären folgendes:

Statisches Linken erscheint mir in Deinem Fall als beste Lösung. Wenn immer noch Referenzen auf ein Manifest erzeigt werden und Depends auch solche Abhängigkkeiten anzeigt ist zu klären woher die kommen.

1. Verwendest Du eine Third-Party Library.
2. Hast Du evtl. durch ds probieten irgendeinen Manifest Trümmer noch rumliegen, der einfach falsch ist?
3. Verwende die Linker Option /Verbose um mitzubekommen wer welche Library linken will.

Nur wenn statisches Linken nicht gewünscht/möglich ist würde ich mich um eine app-lokale Installation bemühen. Aber auch das nur, wenn es notwendig ist.

Vergiss nicht, dass ganze kann fürchterlich in die Hose gehen, wenn andere Applikationen in deren Prozess Dein COM Objekt geladen wird auch soähnliche Sachen macht und braucht...
Reduziere die Abhängigkeiten! Oder verwende SxS! Also nicht app-lokal!

_________________
Martin Richter (MVP für C++ von 2000 bis 2015) 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
nep
Autor

Benutzerprofil
Anmeldungsdatum: 20.12.2002
Beiträge: 913
Beitrag nep Autor 14:43:08 15.05.2007   Titel:              Zitieren

Hmm also eine Third-Party Lib verwende ich nicht. Ich benutze halt noch GdiPlus; ob das jetzt als 3rd party lib zählt weiß ich nicht. Da gibts aber eigentlich auch keine Probleme, hoffe ich zumindest.

Also ich muss zugeben ich kenn mich mit dem ganzen Manifest-Zeugs sowieso nicht aus, aber ich denke nicht, dass da noch alte ungültige Sachen rumliegen. Ich hab eben das "Hauptmanifest", dass ich selbst manipuliert habe, und die beiden anderen Manifeste jeweils im VCR und MFC Unterordner unter release. Manifest wird eben auch nicht mehr in das Kompilat eingebettet. Das sollte eigentlich schon stimmen.

Was meinst du mit "verwende SxS"? Evtl. so einen MSI Installer mit dem die ganzen DLLs dann auch auf dem Zielsystem in dem WinSxS Ordner installiert werden?
Weil genau das hab ich jetzt nämlich vorhin versucht. Da gibst ja diese VC-Redistributable Packages und das hab ich jetzt mal auf einem Ziel-Rechner probiert. Und nach der Installation hat das Registrieren des Filters dann auch tatsächlich problemlos geklappt.
Ist das dann prinzipiell okay, wenn ich zusätzlich zu meinem Filter einfach noch diesen Installer weitergebe, oder kanns da auch zu Schwierigkeiten kommen? (evtl. dass dann andere Programme nicht mehr funktionieren, obwohl das ja meines Wissens genau durch dieses SxS-Dingens verhindert werden soll?)
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 15337
Beitrag Martin Richter Moderator 14:48:48 15.05.2007   Titel:              Zitieren

nep schrieb:
Hmm also eine Third-Party Lib verwende ich nicht. Ich benutze halt noch GdiPlus; ob das jetzt als 3rd party lib zählt weiß ich nicht. Da gibts aber eigentlich auch keine Probleme, hoffe ich zumindest.


Das ist schon mal gut! Also kümmern wir uns um statisches Linken!

nep schrieb:

Also ich muss zugeben ich kenn mich mit dem ganzen Manifest-Zeugs sowieso nicht aus, aber ich denke nicht, dass da noch alte ungültige Sachen rumliegen. Ich hab eben das "Hauptmanifest", dass ich selbst manipuliert habe, und die beiden anderen Manifeste jeweils im VCR und MFC Unterordner unter release. Manifest wird eben auch nicht mehr in das Kompilat eingebettet. Das sollte eigentlich schon stimmen.


Wenn Du statisch linkst solltest Du die Manifeste die erzeugt werden gar nicht anrühren. Theoretisch benötigst Du dann nämlich gar kein Manifest!

Was steht denn nun in dem Manifest, das Du verwendest?

nep schrieb:

Was meinst du mit "verwende SxS"? Evtl. so einen MSI Installer mit dem die ganzen DLLs dann auch auf dem Zielsystem in dem WinSxS Ordner installiert werden?

Will heißen. Lass die Manifeste automatisch erzegen und installiere vcredist_x86.exe! Dass instaliert unter XP/2003 eben Side by Side (abk. SxS).

nep schrieb:

Weil genau das hab ich jetzt nämlich vorhin versucht. Da gibst ja diese VC-Redistributable Packages und das hab ich jetzt mal auf einem Ziel-Rechner probiert. Und nach der Installation hat das Registrieren des Filters dann auch tatsächlich problemlos geklappt.
Ist das dann prinzipiell okay, wenn ich zusätzlich zu meinem Filter einfach noch diesen Installer weitergebe, oder kanns da auch zu Schwierigkeiten kommen? (evtl. dass dann andere Programme nicht mehr funktionieren, obwohl das ja meines Wissens genau durch dieses SxS-Dingens verhindert werden soll?)


Nein! Wenn Du die entsprechenden Runtime Module mit den Merge Modulen installierst sollte alles gehen!


Dennoch! Du musst gar nichts weiter installieren wenn Du statisch linkst!

_________________
Martin Richter (MVP für C++ von 2000 bis 2015) 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
nep
Autor

Benutzerprofil
Anmeldungsdatum: 20.12.2002
Beiträge: 913
Beitrag nep Autor 15:11:07 15.05.2007   Titel:              Zitieren

Martin Richter schrieb:

Wenn Du statisch linkst solltest Du die Manifeste die erzeugt werden gar nicht anrühren. Theoretisch benötigst Du dann nämlich gar kein Manifest!

Was steht denn nun in dem Manifest, das Du verwendest?


Ok, also ich hab jetzt nochmal testweise es so eingestellt, dass das Manifest nicht eingebettet wird, so dass ichs mir anschauen kann. Hab eingestellt, dass die MFC statisch hinzugelinkt werden soll (mehr muss ich doch dann nicht einstellen oder?!). Und im Manifest krieg ich dann eben trotzdem dependencies auf Microsoft.VC80.CRT und Microsoft.VC80.MFC. Das ganze erzeugte Manifest-File sieht dann so aus, falls es dich interessiert:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?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.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC80.MFC" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>




Martin Richter schrieb:

Lass die Manifeste automatisch erzegen und installiere vcredist_x86.exe! Dass instaliert unter XP/2003 eben Side by Side (abk. SxS).

Martin Richter schrieb:

... Wenn Du die entsprechenden Runtime Module mit den Merge Modulen installierst sollte alles gehen!

Also das was du oben sagst, hab ich eben genauso gemacht und das hat dann auch funktioniert, also nehme ich mal an, dass das schon richtig ist.
Was meinst du mit den Runtime und Merge Modulen :confused: Sry ich kenn mich damit absolut nicht aus... wie gesagt ich hab eben einfach ganz normal kompiliert (MFC statisch gelinkt) und dann auf den Zielsystemen eben jene vcredist_x86.exe dann noch installiert. Was hat das mit Merge Modulen auf sich?


Martin Richter schrieb:

Dennoch! Du musst gar nichts weiter installieren wenn Du statisch linkst!


Ja, das dachte ich auch immer... aber das scheint hier wohl bisschen anders zu sein. Wenn ich ne normale MFC Exe erzeuge und da statisch linke, dann hab ich tatsächlich keine Abhängigkeit auf die Runtimes. Bei meinem Projekt hier aber schon. Frag mich nicht warum, aber in Bezug auf DirectShow sind mir/uns hier schon so einige komische Dinge aufgefallen. Kann natürlich sein, dass man noch zusätzlich was anderes einstellen muss... keine Ahnung.
Also will dich damit jetzt eigentlich auch nicht soo nerven... wenn ich es richtig verstanden habe, dann wird es so wie ich es jetzt gemacht habe schon irgendwie passen ;)

Danke auf jeden Fall :live:


Zuletzt bearbeitet von nep am 15:12:36 15.05.2007, insgesamt 1-mal bearbeitet
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 15337
Beitrag Martin Richter Moderator 16:13:32 15.05.2007   Titel:              Zitieren

Bevor ich detailierter antworte:
Bitte gehe auch in die C++ Compiler Optionen.

C/C++ -> Code Generation -> Runtime Library
Dort muss stehen: /MT (für Release) bzw. /MTd (für Debug)!
Das ist evtl. noch Dein Fehler.

Wie Du sehen kannst wird nur noch für die CRT ein Manifest gefordert.

Nach dieser Einstellung sollte gar kein Manifest mehr gefordert werden.

_________________
Martin Richter (MVP für C++ von 2000 bis 2015) 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
nep
Autor

Benutzerprofil
Anmeldungsdatum: 20.12.2002
Beiträge: 913
Beitrag nep Autor 16:49:24 15.05.2007   Titel:              Zitieren

Also da hatte ich auch schon davor verschiedene Einstellungen ausprobiert aber das brachte bzw. bringt nichts. Sprich immer noch Abhängigkeit auf die MFC.
Keine Ahnung wieso, aber ist halt wohl leider so.
Aber wie gesagt, wenn ich vcredist_x86.exe auf den Ziel-PCs vorher installiere, dann klappt es auch... hab mich halt gefragt, ob das generell okay ist oder obs da noch irgendwelche Fallstricke gibt.

Bzw ist mir mal aufgefallen, dass ich meinen Filter generell nur dann registrieren kann, wenn das Manifest eingebettet ist. Sobald das nicht eingebettet ist funktioniert es nicht.
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 15337
Beitrag Martin Richter Moderator 16:50:31 15.05.2007   Titel:              Zitieren

Kannst Du mir das Projekt mailen oder ist es secret?

_________________
Martin Richter (MVP für C++ von 2000 bis 2015) 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
nep
Autor

Benutzerprofil
Anmeldungsdatum: 20.12.2002
Beiträge: 913
Beitrag nep Autor 17:01:16 15.05.2007   Titel:              Zitieren

Naja also von meiner Seite aus würde ich es schon machen, aber das darf ich nicht, da das firmen-intern ist.
Also ich weiß dass sich das auch alles bisschen komisch anhört, aber es ist halt wirklich bisschen anders wie wenn man "normale" Applikationen erstellt. Wir programmieren hier hauptsächlich DirectShow-Filter, und das was wir da machen, das ist schon sehr sehr speziell. V.a. ist die Filter-Programmierung in DirectShow an sich schon etwas... nun ja... seltsam. Was da z.T. in den Dokus steht kannst oft grad vergessen, weil es dann doch wieder ganz anders ist. Das ist auch bei Leuten hier so, die das schon jahrelang machen. Da ist man oftmals heilfroh wenn man ein Projekt überhaupt compiliert kriegt ;)
---
Unregistrierter




Beitrag --- Unregistrierter 17:08:11 15.05.2007   Titel:              Zitieren

Zitat:
Naja also von meiner Seite aus würde ich es schon machen, aber das darf ich nicht, da das firmen-intern ist.


kannste kein minimal-bespiel erstellen das den fehler zeigt??
C++ Forum :: MFC (Visual C++) ::  Sehr spezielles Problem - (DLL + Manifest)  
Gehen Sie zu Seite 1, 2, 3  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.