6 votes

Retarder le chargement de la dll en mode release

Dans un projet C que je construis dans Visual Studio (C++ 2010 Express), j'utilise le moteur MatLab pour permettre à un utilisateur de fournir une fonction personnalisée à utiliser dans le projet. Le problème est que ce code doit également pouvoir être exécuté sur des ordinateurs sur lesquels MatLab n'est pas installé, ce qui signifie que les DLL nécessaires ne seront pas disponibles sur l'ordinateur dans ce cas. Bien sûr, cela ne devrait fonctionner que si l'utilisateur n'essaie pas d'accéder à la partie du code qui appelle le moteur MatLab (j'ai fourni un drapeau pour cela).

J'ai 3 dll qui sont nécessaires pour ce scénario.

  • libmx.dll
  • libmex.dll
  • libeng.dll

Jusqu'à présent, j'ai été en mesure de charger la libeng.dll au moment de l'exécution en utilisant LoadLibrary y GetProcAddress . Les deux autres DLL sont un peu plus difficiles, car en plus du code C qui appelle le moteur MatLab, le code est souvent compilé en tant que fichier mex (exécutable MatLab), pour permettre aux utilisateurs de l'appeler depuis MatLab. Lors de la compilation en tant que fichier mex, libmx.dll et libmex.dll sont liées dynamiquement par le compilateur mex. Cela signifie que l'utilisation de LoadLibrary y GetProcAddress ne fonctionnent pas pour ces DLL.

Actuellement, j'ajoute simplement les librairies libmx et libmex aux propriétés de l'éditeur de liens dans Visual Studio et cela fonctionne bien, mais cela ne sera pas possible pour quelqu'un qui n'a pas MatLab installé.

J'ai essayé d'utiliser delayLoad et cela fonctionne si je compile en mode Debug, mais donne cette erreur de construction lorsque je compile en mode release.

1>C:\Program Files (x86)\MATLAB\R2012a\bin\win32\libmx.dll : fatal error LNK1107: invalid or corrupt file: cannot read at 0x2B8

Existe-t-il un moyen d'éviter complètement la recherche/le chargement de ces DLL si la partie du code qui les utilise n'est pas accessible ?

C'est la ligne de commande pour l'éditeur de liens :

/OUT:"C:\Users\A.Vandenber\documents\visual studio 2010\Projects\Flash\Release\Flash.exe" /NOLOGO "C:\Program Files (x86)\MATLAB\R2012a\bin\win32\libmx.lib" "C:\Program Files (x86)\MATLAB\R2012a\bin\win32\libmex.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /DELAYLOAD:"libmex.dll" /DELAYLOAD:"libmx.dll" /MANIFEST /ManifestFile:"Release\Flash.exe.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\Users\A.Vandenber\documents\visual studio 2010\Projects\Flash\Release\Flash.pdb" /OPT:REF /OPT:ICF /PGD:"C:\Users\A.Vandenber\documents\visual studio 2010\Projects\Flash\Release\Flash.pgd" /LTCG /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:QUEUE

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X