Sehr spezielles Problem - (DLL + Manifest)



  • 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...


  • Mod

    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!



  • 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?)


  • Mod

    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 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:

    <?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 😕 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 👍


  • Mod

    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.



  • 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.


  • Mod

    Kannst Du mir das Projekt mailen oder ist es secret?



  • 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 😉



  • 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??


  • Mod

    Also mich macht einfach stutzig, dass ein Manifest erzeugt wird wenn MFC+CRT auf statischer Bindung stehen.

    Erzeuge mal ein Projekt From-Scratch!

    EDIT: Noch ne Idee. Schick mir doch nur mal die vcproj Datei, oder alle Object-Dateien.



  • Wie stellst du dir das vor? Also so einfach ist das nicht, da man für einen Filter immer bestimmte Schnittstellen implementieren muss. Aber ich meine ok, generell kann ich da mal schauen... (komm ich heute aber nicht mehr dazu).
    Wobei das aber dann auch für denjenigen der sich das anschauen will nicht so einfach ist. Platform-SDK muss installiert sein, ok das haben die meisten wohl. Aber dann muss man erst mal das Projekt kompilieren könne, und ob dus glaubst oder nicht, aber nur weil man bei einem PC das Projekt kompilieren kann, heißt das noch lange nicht dass man es auf dem anderen auch kann (und das hat nix mit hardcodierten Pfaden oder so zu tun, obwohl man da z.T. auch nicht drum rum kommt).
    Das fängt z.B. schon damit an, dass es da sog. Baseclasses gibt die man sich selbst kompilieren muss im Platform-SDK, und da gibts manchmal auch Probleme, auch wenn man da schon ne kompilierte Lib-Datei weitergibt...

    <EDIT>
    Das war an "---" gerichtet 😉

    Also ich hab dir die Projekt-Datei an die Email-Adresse geschickt die in deinem Blog steht. Interessant ist nur die Win32|Release Konfiguration, die anderen kannst du vergessen, da ich die nicht benutze. Da stehen z.T. Sachen drinnen die ungültig sind.
    Ich muss jetzt aber auch los von der Arbeit, sonst verpass ich meinen Bus. Bin erst später wieder zuhause (->Training).
    </EDIT>


  • Mod

    Also das Release Projekt müsste korrekt sein. Es dürfte keinen Bezug auf die MFC+CRT als DLL geben.

    Rebuild All hast Du gemacht?

    Schau mal mit Dumpbin in die Objekt Dateien, welche einen manifest Eintrag enthält!



  • Jo, hab paar mal Rebuild und Clean und sowas gemacht.

    Das mit den Objektdateien kann ich erst morgen machen, da ich dann erst wieder auf der Arbeit bin.

    Aber wie gesagt ich will dich gleich mal vorwarnen: Als ich hier vor kurzem angefangen habe zu arbeiten wurde mir auch einiges erzählt wie das so mit DirectShow abläuft... da hab ich zuerst auch mal müde gelächelt, aber habs dann selbst erfahren müssen. Da entbehrt manches wirklich jeglicher Logik...
    Muss hier aber jetzt natürlich nicht unbedingt zutreffen.



  • Wie mache ich das denn mit dumpbin, bzw. woran sehe ich dass da ein Manifest enthalten ist? Sry hab noch nie was damit gemacht...

    Mal noch ne andere Frage... gibts eigentlich irgendeine Möglichkeit herauszufinden, ob die DLLs von dem vcredist_x86 schon installiert sind?
    Bzw. evtl allgemein, dass man eben schauen kann welche Versionen von welcher DLL in diesem Side by Side Ordner installiert sind?


  • Mod

    Dumpbin /ALL auf eine Objekt Datei durchführen

    Meistens steht das Manifest direkt oben.
    AW DATA #1
    00000000: 20 20 20 2F 6D 61 6E 69 66 65 73 74 64 65 70 65 /manifestdepe
    00000010: 6E 64 65 6E 63 79 3A 22 74 79 70 65 3D 27 77 69 ndency:"type='wi
    00000020: 6E 33 32 27 20 6E 61 6D 65 3D 27 4D 69 63 72 6F n32' name='Micro
    00000030: 73 6F 66 74 2E 56 43 38 30 2E 44 65 62 75 67 43 soft.VC80.DebugC
    00000040: 52 54 27 20 76 65 72 73 69 6F 6E 3D 27 38 2E 30 RT' version='8.0
    00000050: 2E 35 30 37 32 37 2E 37 36 32 27 20 70 72 6F 63 .50727.762' proc
    00000060: 65 73 73 6F 72 41 72 63 68 69 74 65 63 74 75 72 essorArchitectur
    00000070: 65 3D 27 78 38 36 27 20 70 75 62 6C 69 63 4B 65 e='x86' publicKe
    00000080: 79 54 6F 6B 65 6E 3D 27 31 66 63 38 62 33 62 39 yToken='1fc8b3b9
    00000090: 61 31 65 31 38 65 33 62 27 22 20 2F 44 45 46 41 a1e18e3b'" /DEFA
    000000A0: 55 4C 54 4C 49 42 3A 22 6D 66 63 38 30 64 2E 6C ULTLIB:"mfc80d.l
    000000B0: 69 62 22 20 2F 44 45 46 41 55 4C 54 4C 49 42 3A ib" /DEFAULTLIB:
    000000C0: 22 6D 66 63 73 38 30 64 2E 6C 69 62 22 20 2F 44 "mfcs80d.lib" /D

    Siehe C:\WINDOWS\WinSxS Verzeichnis
    Dort siehst Du exakt die Namen die auch im Manifest gefordert werden.

    C:\WINDOWS\WinSxS\x86_Microsoft.VC80.MFCLOC_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_91481303
    C:\WINDOWS\WinSxS\x86_Microsoft.VC80.ATL_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_6e805841
    C:\WINDOWS\WinSxS\x86_Microsoft.VC80.ATL_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_cbb27474
    C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd
    C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.163_x-ww_681e29fb
    C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700
    C:\WINDOWS\WinSxS\x86_Microsoft.VC80.MFC_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_dec6ddd2
    C:\WINDOWS\WinSxS\x86_Microsoft.VC80.MFC_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_3bf8fa05
    C:\WINDOWS\WinSxS\x86_Microsoft.VC80.MFCLOC_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_3415f6d0



  • Also...

    das sieht eigentlich bei allen relativ gleich aus, ist wohl bei allen ein Manifest-Eintrag enhalten. Hier mal ein Auszug:

    RAW DATA #1
      00000000: 20 20 20 2F 6D 61 6E 69 66 65 73 74 64 65 70 65     /manifestdepe
      00000010: 6E 64 65 6E 63 79 3A 22 74 79 70 65 3D 27 77 69  ndency:"type='wi
      00000020: 6E 33 32 27 20 6E 61 6D 65 3D 27 4D 69 63 72 6F  n32' name='Micro
      00000030: 73 6F 66 74 2E 56 43 38 30 2E 43 52 54 27 20 76  soft.VC80.CRT' v
      00000040: 65 72 73 69 6F 6E 3D 27 38 2E 30 2E 35 30 36 30  ersion='8.0.5060
      00000050: 38 2E 30 27 20 70 72 6F 63 65 73 73 6F 72 41 72  8.0' processorAr
      00000060: 63 68 69 74 65 63 74 75 72 65 3D 27 78 38 36 27  chitecture='x86'
      00000070: 20 70 75 62 6C 69 63 4B 65 79 54 6F 6B 65 6E 3D   publicKeyToken=
      00000080: 27 31 66 63 38 62 33 62 39 61 31 65 31 38 65 33  '1fc8b3b9a1e18e3
      00000090: 62 27 22 20 2F 44 45 46 41 55 4C 54 4C 49 42 3A  b'" /DEFAULTLIB:
      000000A0: 22 75 75 69 64 2E 6C 69 62 22 20 2F 44 45 46 41  "uuid.lib" /DEFA
      000000B0: 55 4C 54 4C 49 42 3A 22 75 75 69 64 2E 6C 69 62  ULTLIB:"uuid.lib
      000000C0: 22 20 2F 44 45 46 41 55 4C 54 4C 49 42 3A 22 6D  " /DEFAULTLIB:"m
      000000D0: 66 63 38 30 2E 6C 69 62 22 20 2F 44 45 46 41 55  fc80.lib" /DEFAU
      000000E0: 4C 54 4C 49 42 3A 22 6D 66 63 73 38 30 2E 6C 69  LTLIB:"mfcs80.li
      000000F0: 62 22 20 2F 44 45 46 41 55 4C 54 4C 49 42 3A 22  b" /DEFAULTLIB:"
      00000100: 6D 73 76 63 72 74 2E 6C 69 62 22 20 2F 44 45 46  msvcrt.lib" /DEF
      00000110: 41 55 4C 54 4C 49 42 3A 22 6B 65 72 6E 65 6C 33  AULTLIB:"kernel3
      00000120: 32 2E 6C 69 62 22 20 2F 44 45 46 41 55 4C 54 4C  2.lib" /DEFAULTL
      00000130: 49 42 3A 22 75 73 65 72 33 32 2E 6C 69 62 22 20  IB:"user32.lib" 
      00000140: 2F 44 45 46 41 55 4C 54 4C 49 42 3A 22 67 64 69  /DEFAULTLIB:"gdi
      00000150: 33 32 2E 6C 69 62 22 20 2F 44 45 46 41 55 4C 54  32.lib" /DEFAULT
      00000160: 4C 49 42 3A 22 6D 73 69 6D 67 33 32 2E 6C 69 62  LIB:"msimg32.lib
      00000170: 22 20 2F 44 45 46 41 55 4C 54 4C 49 42 3A 22 63  " /DEFAULTLIB:"c
      00000180: 6F 6D 64 6C 67 33 32 2E 6C 69 62 22 20 2F 44 45  omdlg32.lib" /DE
      00000190: 46 41 55 4C 54 4C 49 42 3A 22 77 69 6E 73 70 6F  FAULTLIB:"winspo
      000001A0: 6F 6C 2E 6C 69 62 22 20 2F 44 45 46 41 55 4C 54  ol.lib" /DEFAULT
      000001B0: 4C 49 42 3A 22 61 64 76 61 70 69 33 32 2E 6C 69  LIB:"advapi32.li
      000001C0: 62 22 20 2F 44 45 46 41 55 4C 54 4C 49 42 3A 22  b" /DEFAULTLIB:"
      000001D0: 73 68 65 6C 6C 33 32 2E 6C 69 62 22 20 2F 44 45  shell32.lib" /DE
      000001E0: 46 41 55 4C 54 4C 49 42 3A 22 63 6F 6D 63 74 6C  FAULTLIB:"comctl
      000001F0: 33 32 2E 6C 69 62 22 20 2F 44 45 46 41 55 4C 54  32.lib" /DEFAULT
      00000200: 4C 49 42 3A 22 73 68 6C 77 61 70 69 2E 6C 69 62  LIB:"shlwapi.lib
      00000210: 22 20 2F 69 6E 63 6C 75 64 65 3A 5F 5F 61 66 78  " /include:__afx
      00000220: 46 6F 72 63 65 45 58 43 4C 55 44 45 20 2F 69 6E  ForceEXCLUDE /in
      00000230: 63 6C 75 64 65 3A 5F 5F 61 66 78 46 6F 72 63 65  clude:__afxForce
      00000240: 53 54 44 41 46 58 20 2F 6D 61 6E 69 66 65 73 74  STDAFX /manifest
      00000250: 64 65 70 65 6E 64 65 6E 63 79 3A 22 74 79 70 65  dependency:"type
      00000260: 3D 27 77 69 6E 33 32 27 20 6E 61 6D 65 3D 27 4D  ='win32' name='M
      00000270: 69 63 72 6F 73 6F 66 74 2E 56 43 38 30 2E 4D 46  icrosoft.VC80.MF
      00000280: 43 27 20 76 65 72 73 69 6F 6E 3D 27 38 2E 30 2E  C' version='8.0.
      00000290: 35 30 36 30 38 2E 30 27 20 70 72 6F 63 65 73 73  50608.0' process
      000002A0: 6F 72 41 72 63 68 69 74 65 63 74 75 72 65 3D 27  orArchitecture='
      000002B0: 78 38 36 27 20 70 75 62 6C 69 63 4B 65 79 54 6F  x86' publicKeyTo
      000002C0: 6B 65 6E 3D 27 31 66 63 38 62 33 62 39 61 31 65  ken='1fc8b3b9a1e
      000002D0: 31 38 65 33 62 27 22 20 2F 69 6E 63 6C 75 64 65  18e3b'" /include
      000002E0: 3A 3F 3F 33 40 59 41 58 50 41 58 40 5A 20 2F 44  :??3@YAXPAX@Z /D
      000002F0: 45 46 41 55 4C 54 4C 49 42 3A 22 75 75 69 64 2E  EFAULTLIB:"uuid.
      00000300: 6C 69 62 22 20 2F 44 45 46 41 55 4C 54 4C 49 42  lib" /DEFAULTLIB
      00000310: 3A 22 75 75 69 64 2E 6C 69 62 22 20 2F 44 45 46  :"uuid.lib" /DEF
      00000320: 41 55 4C 54 4C 49 42 3A 22 75 75 69 64 2E 6C 69  AULTLIB:"uuid.li
      00000330: 62 22 20 2F 44 45 46 41 55 4C 54 4C 49 42 3A 22  b" /DEFAULTLIB:"
      00000340: 6F 6C 65 64 6C 67 2E 6C 69 62 22 20 2F 44 45 46  oledlg.lib" /DEF
      00000350: 41 55 4C 54 4C 49 42 3A 22 6F 6C 65 33 32 2E 6C  AULTLIB:"ole32.l
      00000360: 69 62 22 20 2F 44 45 46 41 55 4C 54 4C 49 42 3A  ib" /DEFAULTLIB:
      00000370: 22 6F 6C 65 61 75 74 33 32 2E 6C 69 62 22 20 2F  "oleaut32.lib" /
      00000380: 44 45 46 41 55 4C 54 4C 49 42 3A 22 75 75 69 64  DEFAULTLIB:"uuid
      00000390: 2E 6C 69 62 22 20 2F 44 45 46 41 55 4C 54 4C 49  .lib" /DEFAULTLI
      000003A0: 42 3A 22 75 72 6C 6D 6F 6E 2E 6C 69 62 22 20 2F  B:"urlmon.lib" /
      000003B0: 44 45 46 41 55 4C 54 4C 49 42 3A 22 6D 73 76 63  DEFAULTLIB:"msvc
      000003C0: 70 72 74 22 20 2F 6D 61 6E 69 66 65 73 74 64 65  prt" /manifestde
      000003D0: 70 65 6E 64 65 6E 63 79 3A 22 74 79 70 65 3D 27  pendency:"type='
      000003E0: 77 69 6E 33 32 27 20 6E 61 6D 65 3D 27 4D 69 63  win32' name='Mic
      000003F0: 72 6F 73 6F 66 74 2E 56 43 38 30 2E 43 52 54 27  rosoft.VC80.CRT'
      00000400: 20 76 65 72 73 69 6F 6E 3D 27 38 2E 30 2E 35 30   version='8.0.50
      00000410: 36 30 38 2E 30 27 20 70 72 6F 63 65 73 73 6F 72  608.0' processor
      00000420: 41 72 63 68 69 74 65 63 74 75 72 65 3D 27 78 38  Architecture='x8
      00000430: 36 27 20 70 75 62 6C 69 63 4B 65 79 54 6F 6B 65  6' publicKeyToke
      00000440: 6E 3D 27 31 66 63 38 62 33 62 39 61 31 65 31 38  n='1fc8b3b9a1e18
      00000450: 65 33 62 27 22 20 2F 44 45 46 41 55 4C 54 4C 49  e3b'" /DEFAULTLI
      00000460: 42 3A 22 4C 49 42 43 4D 54 22 20 2F 44 45 46 41  B:"LIBCMT" /DEFA
      00000470: 55 4C 54 4C 49 42 3A 22 4F 4C 44 4E 41 4D 45 53  ULTLIB:"OLDNAMES
      00000480: 22 20                                            "
    

    und direkt danach kommt dieses:

    Linker Directives
       -----------------
       /manifestdependency:"type='win32'
       name='Microsoft.VC80.CRT'
       version='8.0.50608.0'
       processorArchitecture='x86'
       publicKeyToken='1fc8b3b9a1e18e3b'"
       /DEFAULTLIB:"msvcprt"
       /manifestdependency:"type='win32'
       name='Microsoft.VC80.CRT'
       version='8.0.50608.0'
       processorArchitecture='x86'
       publicKeyToken='1fc8b3b9a1e18e3b'"
       /DEFAULTLIB:"uuid.lib"
       /DEFAULTLIB:"uuid.lib"
       /DEFAULTLIB:"mfc80.lib"
       /DEFAULTLIB:"mfcs80.lib"
       /DEFAULTLIB:"msvcrt.lib"
       /DEFAULTLIB:"kernel32.lib"
       /DEFAULTLIB:"user32.lib"
       /DEFAULTLIB:"gdi32.lib"
       /DEFAULTLIB:"msimg32.lib"
       /DEFAULTLIB:"comdlg32.lib"
       /DEFAULTLIB:"winspool.lib"
       /DEFAULTLIB:"advapi32.lib"
       /DEFAULTLIB:"shell32.lib"
       /DEFAULTLIB:"comctl32.lib"
       /DEFAULTLIB:"shlwapi.lib"
       /include:__afxForceEXCLUDE
       /include:__afxForceSTDAFX
       /manifestdependency:"type='win32'
       name='Microsoft.VC80.MFC'
       version='8.0.50608.0'
       processorArchitecture='x86'
       publicKeyToken='1fc8b3b9a1e18e3b'"
       /include:??3@YAXPAX@Z
       /DEFAULTLIB:"uuid.lib"
       /DEFAULTLIB:"uuid.lib"
       /DEFAULTLIB:"atls.lib"
       /merge:ATL=.rdata
       /DEFAULTLIB:"kernel32.lib"
       /DEFAULTLIB:"user32.lib"
       /DEFAULTLIB:"advapi32.lib"
       /DEFAULTLIB:"ole32.lib"
       /DEFAULTLIB:"shell32.lib"
       /DEFAULTLIB:"oleaut32.lib"
       /DEFAULTLIB:"uuid.lib"
       /DEFAULTLIB:"shlwapi.lib"
    

  • Mod

    Dann ist ganz klar, dass die Compiler Optionen für diese CPP Dateien nicht stimmen!

    Schau Dir crtdefs.h an! Dort werden die Manifeste gesetzt!
    Diese werden eingesetzt nur wenn _DLL gesetzt ist, also wenn /MD oder /MDd definiert ist!

    Mal eine ganz andere Frage: Hast Du etwa _DLL als Präprozessor-Define selbst gesetzt? Ich habe Deine Projekt-Datei gerade nicht vorliegen, weil diese an meine "private" Adresse gesendet wurde.

    Mach mal einen vollen Build und stell mal das Buildlog zur Verfügung!



  • Also...
    ich selbst habe _DLL jedenfalls nicht gesetzt(zumindest nicht explizit), könnte aber evtl. sein dass da was von nem anderen Projekt benutzt wurde, da bin ich mir jetzt relativ unsicher. Ich hab jetzt jedenfalls einfach mal kurzerhand alle Präprozessor-Konstanten rausgeschmissen, und jetzt wurde das Manifest tatsächlich so nicht mehr gefüllt, und die Abhängigkeiten auf die (MFC)Runtimes sind ebenfalls weg 🙂 Sehe das auch daran, dass der erzeugte Filter jetzt auch knapp 350 Kb groß ist (davor warens so ca 120 Kb).
    Jetzt müsste ich das nur noch irgendwie testen 😉 Das blöde ist, dass auf den beiden Test-PCs jetzt schon dieses Redistributable-Package installiert ist, d.h. dass es sowieso auf jeden Fall funktionieren würde. Weißt du ob man das auch wieder irgendwie deinstallieren kann (bzw. wie)?
    Wie auch immer.. nochmals vielen Dank 🙂


  • Mod

    Also Fazit: Das Projekt wurde durch falsche und unsinnige defines verbockt. Ich werde mir Deine Projektdatei zu Hause noch mal ansehen.

    Du kannst das ganze einfach mit Depends prüfen! Die DLL sollte keine Abhängigkeiten gegen irgendeine CRT DLL haben!


Anmelden zum Antworten