Votre attitude face au C me fait penser à un homme de Cro-Magnon (donc un Sapiens Sapiens) en adoration devant la puissance des hommes de Neandertal.
Les hommes de Neandertal étaient plus puissants, plus robustes mais spécialement adaptés à l'aire glacière qui c'est terminée il y a 20000 ans.
La toundra où le C est encore adapté, c'est dans l'embarqué, et elle se réduit de plus en plus.
Et comme l'homme de Neandertal, le C manque cruellement d'outils intégrés d'abstraction.
On va arrêter de filer la métaphore.
FDR2006 a un problème d'édition de lien, très probablement parce qu'il utilise un mécanisme qui nécessite un fichier d'en-tête (.h) et une librairie d'importation (.lib de dll). L'utilisation d'une dll par un programme en C sous Windows n'a pas besoin, dans l'absolu, de ces fichiers, mais cela nécessite l'utilisation des primitive LoadLibrary (http://msdn.microsoft.com/en-us/libr...75(VS.85).aspx) et GetProcAddress (http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx), très laborieuses à utiliser.
Il faut noter que l'utilisation de la bidouille dans VB génère le fichier .lib nécessaire à FDR2006. Il ne reste que le fichier d'en-tête (.h) que FDR2006 semble avoir déjà créé.
Donc le problème de FDR2006 est lié, je pense, à une mauvaise manipulation du côté du client de test en C et non à votre dll.
En regardant la copie d'écran de Dependency Walker, vous voyez que la dll exporte 6 fonctions.
"DllCanUnloadNow", "DllGetClassObject", "DllRegisterServer", "DllUnregisterServer" sont les quatre fonctions nécessaires à l'utilisation par COM/ActiveX.
"DllMain" et "TestPb" sont des fonctions exportées supplémentaires que vous avez vous même désignées avec votre fichier DLL.def.
Avec les 4 fonctions COM/Active, vous disposez d'une dll utilisable par tout les langages COM aware, comme VB6, mais aussi le C++ (avec VC++6 ou Visual Studio) et tous les langages .NET (via InterOp COM/.NET).
Avec la fonction "TestPb", vous disposez d'une fonction appelable depuis un langage acceptant des dll exportant selon les conventions "C", donc à peu près tous les langages dont le "C" ou VB (via Declare).
Attention, votre dll dispose de 2 interfaces (ensembles de fonctionnalités) distinctes, celles accessibles depuis l'interface COM, donc l'ensemble des classes définies dans votre dll (peut-être aucune), et celles accessibles par l'ensemble des fonctions spécifiées dans le fichier Dll.def.
J'insiste sur le fait que l'interface COM est d'un niveau d'abstraction et d'une facilité d'utilisation bien supérieure à celle exportée via des fonctions "C" aware. Le seul avantage de la seconde interface est son utilisation possible par des langages anciens ou ayant une très faible intégration dans la plateforme Windows.
Vous avez donc une Dll bien meilleure que votre objectif initial.
Il faut aussi remarquer, pour les spécialiste, que l'exportation de la dll ne suis pas les conventions de nommage des exports "C" (http://blogs.msdn.com/b/oldnewthing/.../08/48616.aspx). Ces conventions ne sont pas obligatoire mais peuvent faciliter l'utilisation de la dll en absence de fichier .lib.
Je pense que la seule chose que cette DLL a de commun avec les DLL C, c'est qu'il n'est plus besoin de l'enregistrer dans la BDR, et que l'on peut l'appeler par un DECLARE.
Vous avez même mieux qu'une Dll C.
Mais a part ça ...elle ne doit pas avoir grand chose de commun
C'est une "Dll C", avec des choses en plus (un interfaçage COM/ActiveX).
La DLL VB6 appelle le runtime de VB "MSVBVM60.DLL", ce qui veut bien dire que ce n'est pas une DLL C.
Non, c'est une Dll C, qui peut utiliser n'importe quelle dll dans l'implémentation de ces fonctionnalités. Oui, votre dll utilise le Runtime VB.
Les autres appellent MSVCRT.DLL, je ne sait pas ce que c'est...mais en tout cas ce n'est pas le runtime
Et bien si, c'est le Runtime-C (MSVCRT -> M$ Visual C RunTime).
Je pense que vous considérez une Dll C avec une aura de mystère qui n'existe pas. Une dll ayant une interface compatible C est bien plus archaïque que celle de VB. Cet archaïsme permet aux langages archaïques, comme le C, de pouvoir s'en servir.
C'est un nivellement par le bas.
Partager