2009-01-06 9 views
2

J'ai une DLL d'extension ISAPI écrite en C++ à l'aide de Microsoft Visual Studio 2003 exécuté dans IIS 5.1 sous XP Pro. Chaque fois qu'un _ASSERTE se déclenche, je reçois une boîte de message vide avec 'Error' dans la barre de titre et les boutons Abort/Retry/Ignore. Ce que je ne vois pas, c'est le texte d'expression de la macro _ASSERTE. J'ai tracée dans le code source de la bibliothèque d'exécution et je me retrouve dans crtmbox.c sur une ligne qui semble appeler un MessageBoxA() dynamiquement chargé. lpText (Échec de débogage ...) et lpCaption (bibliothèque de débogage Microsoft Visual C++) sont valides. Si je débogue le processus IIS, le bouton Réessayer entre dans le débogueur. Si j'exécute le même code à partir d'un exécutable Windows construit à partir de la même source, j'obtiens la boîte de message Assert à laquelle je m'attendrais.Boîte de dialogue _ASSERTE vide de l'extension ISAPI

Je suis sûr que j'ai déjà vu ça fonctionner par le passé. En fait, le passage à Visual Studio 2003 a été initialement utile car la bibliothèque d'exécution 2003 ajoute correctement MB_SERVICE_NOTIFICATION aux indicateurs MessageBox afin qu'au moins la boîte de message résultante soit visible sur la console lors du débogage du service.

Vous avez des idées?

JF

Répondre

1

Je n'ai aucune solution pour vous, seule une suggestion d'enquête. Une fois que vous avez essayé de relâcher le débogueur, avez-vous regardé la pile d'appels pour voir le contexte dans lequel l'assertion se produit? Oh, j'ai regardé attentivement _ASSERTE et cela dépend de _CRT_WIDE pour passer la chaîne de message. S'il y avait une incompatibilité entre la façon dont _ASSERTE a été compilé (avec des chaînes larges) et le chargement dynamique pfnMessageBoxA (semble être le type de chaîne 'narrow'), quand la chaîne de message ressemblerait à une chaîne de longueur nulle. DevStudio 2003 par défaut ses projets à des chaînes larges que vous connaissez.