2010-09-06 7 views
0

(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.

+1

Afficher le code réel qui causent vos problèmes - les déclarations de fonction sont OK. – kludg

+1

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

Répondre

1

Merci à ceux qui ont répondu. Cela s'est avéré être l'un de ces cas où les symptômes étaient vraiment trompeurs. Le vrai problème était que la première constante d'énumération utilisée pour définir des bits, qui avait bien sûr la valeur 1, était illégale dans le contexte de l'appel. C'est pourquoi seules les valeurs de bitset "pairées" ont réussi. C'était uniquement parce que la valeur d'énumération illégale n'était pas présente. Il s'avère que le lien DLL était sain.

Questions connexes