C ++ / CLI & # 8212; 0xc000007b (INVALID_IMAGE_FORMAT) con l'opzione / clr attiva
-
22-07-2019 - |
Domanda
Sto cercando di creare un eseguibile C ++ / CLI al quale collego staticamente ffmpeg (libavcodec, libavformat, libavutil & amp; swscale). Funziona bene se lo costruisco normalmente (senza / clr, quindi nessun supporto CLR), funziona. Tuttavia, quando aggiungo il supporto CLR, non verrà avviato con uno 0xc000007b. A " Hello World " Tuttavia, l'app C ++ / CLI funziona correttamente.
Presumibilmente la stessa cosa accade con Boost :: Threads, ma poiché ffmpeg è puro C, dubito che stia usando Boost.
La mia configurazione:
- Visual Studio 2008 Professional SP1
- Windows XP Pro SP3 (x86)
- .NET Framework 3.5 SP1
Grazie, Robert
Soluzione
Potrebbe non utilizzare boost, ma probabilmente utilizza thread e thread di archiviazione locale, il che porta allo stesso problema. CLR non è compatibile con __declspec (thread). Credo che non ci sia una soluzione semplice, a meno che tu non sia disposto a modificare il codice ffmpeg (se lo sei, google quelle parole chiave per esempio: clr, __declspec (thread)).
Suggerisco di isolare ffmpeg in un processo diverso e di utilizzare alcuni mezzi di comunicazione tra processi.
Altri suggerimenti
Ho riscontrato un problema simile che riguardava DirectEditServices. La soluzione è risultata correlata al tipo di Thread Apartment. In .Net 2.0 e versioni successive il tipo di thread apartment predefinito è passato da STA a MTA. Alcuni oggetti C ++ nativi non supportano MTA. Ho avuto successo generando un thread e impostando manualmente il tipo di appartamento su STA. Tenere presente che qualsiasi comunicazione tra processi con un oggetto C ++ nativo che non supporta STA deve avvenire sul thread STA che crea un'istanza dell'oggetto.