2010-05-07 3 views
1

Récemment, j'ai trouvé un problème avec le compilateur Visual C++ 2008, mais en utilisant un hack mineur, je l'évite. Actuellement, je ne peux pas utiliser le même hack, mais le problème existe comme en 2008 comme en 2010 (Express).Erreur fatale lors de l'utilisation de FICHIER * dans Windows à partir de la DLL

Alors, je l'ai préparé pour vous 2 simple fichier C: un pour DLL, un pour programme:

DLL (fichier dll.c):

#include <stdio.h> 

__declspec(dllexport) void 
print_to_stream (FILE *stream) 
{ 
    fprintf (stream, "OK!\n"); 
} 

Et pour le programme, qui liens cette DLL via un fichier-dll.lib:

Programme:

#include <stdio.h> 

__declspec(dllimport) void print_to_stream (FILE *stream); 

int 
main (void) 
{ 
    print_to_stream (stdout); 
    return 0; 
} 

Pour compiler et lier DLL:

cl /LD file-dll.c 

Pour compiler et programme de lien:

cl file-test.c file-dll.lib 

Lors de l'appel de fichiers test.exe, j'ai eu l'erreur fatale (similaire à la segmentation défaut sous UNIX).

Comme je l'ai dit au début, j'avais déjà le même problème avant: sur le transfert du pointeur FILE * vers la DLL. Je pensais que c'était peut-être à cause de la discordance du compilateur, mais maintenant j'utilise un compilateur pour tout et ce n'est pas le problème. ;-(

Que puis-je faire maintenant

UPD: J'ai trouvé la solution:

cl /LD /MD file-dll.c 
cl /MD file-test.c file-dll.lib 

La clé est de créer un lien vers la bibliothèque dynamique, mais (je ne savais pas il) par défaut, il lie erreur staticaly et (hencefore) se produit (je vois pourquoi).

PS Merci pour la patience.

Répondre

4

Potential Errors Passing CRT Objects Across DLL Boundaries

Voici un exemple spécifique pour votre situation. Selon la façon dont vous compilez votre DLL et votre programme, vous pourriez avoir des copies séparées du CRT qui entraîneront une violation d'accès.

+0

Oui, je l'ai déjà trouvé. Merci à vous. –

Questions connexes