Je rencontre une violation d'accès lors de l'appel d'une DLL dans LabVIEW. Appelons la DLL "extcode.dll". Je n'ai pas son code, il vient d'un fabricant externe.Violation d'accès dans l'appel LoadLibrary()
Courir dans Windbg, il est arrêté avec le message:
(724.1200): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
ntdll!RtlNewSecurityObjectWithMultipleInheritance+0x12a:
Et pile appel:
ntdll!RtlNewSecurityObjectWithMultipleInheritance+0x12a
ntdll!MD5Final+0xedfc
ntdll!RtlFindClearBitsAndSet+0xdf4
ntdll!RtlFindClearBitsAndSet+0x3a8
ntdll!RtlFindClearBitsAndSet+0x4b9
ntdll!RtlCreateProcessParametersEx+0x829
ntdll!LdrLoadDll+0x9e
KERNELBASE!LoadLibraryExW+0x19c
KERNELBASE!LoadLibraryExA+0x51
LabVIEW!ChangeVINameWrapper+0x36f5
LabVIEW!ChangeVINameWrapper+0x3970
LabVIEW!ExtFuncDynLibWrapper+0x211
Notez que les dépendances de extcode.dll sont chargées avant violation d'accès.
La situation est aléatoire, mais quand cela arrive, tous les essais ultérieurs l'amènent.
Le code est une simple fonction LabVIEW appelant une fonction dans la DLL, et le prototype est super simple (int function(void)
) donc il ne peut pas être une mauvaise configuration des paramètres d'appel, ni arithmétique de pointeur. J'ai vérifié chaque combinaison de conventions d'appel et de niveaux de vérification d'erreurs.
La DLL fonctionne parfaitement bien lorsqu'elle est appelée dans d'autres environnements (.NET et C).
Je trouve que RtlFindClearBitsAndSet
est lié à des manipulations de tableau de bits
Qu'est-ce que vous faire penser à? Pensez-vous que c'est un problème dans extcode.dll, LabVIEW ou Windows? PS: J'utilise LabVIEW 2010 64 bits, sur Windows 7 64 bits (et extcode.dll est 64 bits). Je n'ai pas réussi à le reproduire sur un système 32 bits.
11/18 EDIT
Je fini par faire un exe autonome qui enveloppe la DLL; LabVIEW communique avec lui via des tuyaux. Cela fonctionne parfaitement, mais je ne comprends pas pourquoi charger une DLL dans LabVIEW peut tomber en panne.
Merci pour votre réponse: prototype est 'int func (void)', il ne peut donc pas s'agir d'une convention d'appel ou d'un problème de pointeur d'argument. – CharlesB
Peut-être que vous devriez ouvrir un dossier de support avec NI. Ils sont assez bons pour aider avec des choses comme ça. –