(RESOLU: Voir réponse personnelle Merci à ceux qui ont répondu).Problème DLL Delphi/C++ - unsigned long vs unsigned int?
Je rencontre un problème étrange avec une DLL C++ que je charge dynamiquement dans mon programme Delphi 6 Pro. L'un des appels de fonction dans la DLL est:
__declspec (dllexport) int foo (entier non signé A, bitsetVector long unsigned);
I ont le pointeur fonction coulée dans ma fonction Delphi que:
foo: function (A: LongWord; bitsetVector: LongWord): nombre entier; stdcall;
Presque tous les autres appels que j'ai mappés à la DLL fonctionnent bien mais celui-ci, qui renvoie une erreur "champ de bits de bits invalides", indiquant qu'il n'aime pas la valeur bitsetVector. Le paramètre bitsetVector est construit en utilisant l'opérateur OR pour définir les bits. Toutes les constantes d'énumération utilisées pour définir les bits sont des puissances de 2 bien sûr. Je suis à peu près sûr que c'est une erreur de distribution d'une manière ou d'une autre, alors je me demande s'il y a une nuance à propos de "unsigned int" vs. "unsigned long" que je ne connais pas. La documentation MSDN C++ montre les deux comme étant 4 octets chacun avec une plage de 0 à 4 294 967 295, de sorte qu'ils me semblent identiques.
Note Bizarro. J'ai essayé d'exécuter une boucle for, de 0 à 100, où je viens de passer la variable for itérateur (i) comme vecteur de bitset. Toutes les valeurs de nombre impair ont échoué alors que tous les nombres pairs ont réussi. C'est pourquoi j'ai l'impression que c'est une erreur de casting. Notez, je n'ai aucune corruption ou erreurs de mémoire. J'ai fait des vérifications complètes avec FastMM4 et il n'y a pas eu de crash de pile ou de corruptions de tas malgré le fait que plusieurs des appels DLL reçoivent des paramètres LongWord et que les paramètres "out" souffrent généralement en premier dans les incompatibilités DLL. En outre, les valeurs que je récupère de la DLL C++ semblent correctes.
Si quelqu'un là-bas a des idées ou réflexions à ce sujet, ou peut-être des connaissances tangentielle qui pourraient révéler le vrai problème si ce n'est pas un problème de casting, je voudrais savoir.
Merci.
Afficher le code réel qui causent vos problèmes - les déclarations de fonction sont OK. – kludg
Cela peut être idiot, mais sur la base des « nombres impairs défaut » partie « tous sont des puissances de 2 » - êtes-vous sûr que vous avez et/ou correctement défini la constante d'énumération pour 2^0 = 1 et que la DLL accepte une valeur '1' (ou nombre impair)? Est-ce que le bit bas a une signification particulière? Il n'y en a pas un de trop ou un peu trop peu de changements à gauche et/ou à droite? – shunty