2009-08-05 4 views
1

J'essaye de construire un exécutable C++/CLI auquel je lie statiquement ffmpeg (libavcodec, libavformat, libavutil & swscale). Cela fonctionne bien si je le construis normalement (sans/clr, donc pas de support CLR), ça marche. Toutefois, lorsque j'ajoute le support CLR, il ne démarrera pas avec un 0xc000007b. Une application "Hello World" C++/CLI fonctionne bien, cependant.C++/CLI - 0xc000007b (INVALID_IMAGE_FORMAT) avec l'option/clr sur

Supposément la même chose arrive avec Boost :: Threads, mais puisque ffmpeg est un C pur, je doute qu'il utilise Boost.

Ma config:

  • Visual Studio 2008 SP1 Professional
  • Windows XP Pro SP3 (x86)
  • .NET Framework 3.5 SP1

Merci, Robert

Répondre

2

Il ne peut pas utiliser boost, mais il utilise probablement des threads et thread le stockage local, qui conduit au même problème. CLR n'est pas compatible avec __declspec (thread). Je crois qu'il n'y a pas de simple contournement, sauf si vous êtes prêt à modifier le code ffmpeg (si vous êtes, google ces mots-clés pour des exemples: clr, __declspec (thread)).

Je suggère d'isoler ffmpeg dans un processus différent et d'utiliser un moyen de communication interprocessus.

+0

Merci - il semble également fonctionner si je lier dynamiquement, mais un processus séparé pourrait être encore une meilleure option pour prévenir les fuites de mémoire, etc. –

2

J'ai rencontré un problème similaire impliquant DirectEditServices. La solution a fini par être liée au type Thread Apartment. Dans .Net 2.0 et versions ultérieures, le type d'appartement de thread par défaut est passé de STA à MTA. Certains objets C++ natifs ne prennent pas en charge MTA. J'ai eu du succès en engendrant un fil et en définissant manuellement le type d'appartement à STA. Gardez à l'esprit que toute communication interprocessus avec un objet C++ natif qui ne prend pas en charge STA doit se produire sur le thread STA qui instancie l'objet.