(решено: см. Автоответчик. Спасибо тем, кто ответил).
У меня странная проблема с C ++ DLL, которую я динамически загружаю в свою программу Delphi 6 Pro.Один из вызовов функций в DLL:
__declspec (dllexport) int foo (unsigned int A, unsigned long bitsetVector);
У меня есть указатель функции, приведенный в моей функции Delphi как:
foo: function (A: LongWord; bitsetVector: LongWord): целое число;stdcall;
Почти все другие вызовы, которые я сопоставил с DLL, работают нормально, но этот, который возвращает ошибку «недопустимое поле набора битов», указывает, что ему не нравится значение bitsetVector.Параметр bitsetVector создается с помощью оператора OR для установки битов.Все константы перечисления, используемые для установки битов, конечно же, имеют степень 2.Я почти уверен, что это какая-то ошибка приведения, поэтому мне интересно, есть ли какой-то нюанс о «unsigned int» и «unsigned long», о котором я не знаю.Документация MSDN C ++ показывает, что они оба по 4 байта каждый с диапазоном от 0 до 4 294 967 295, поэтому они выглядят одинаково для меня.
Замечание Бизарро.Я попытался запустить цикл for в диапазоне от 0 до 100, где я только что передал переменную for (i) в качестве вектора набора битов. Не удалось выполнить все значения нечетных чисел, а все четные числа были выполнены успешно. Вот почему я чувствую, что это ошибка приведения.Обратите внимание, у меня нет повреждений или ошибок памяти.Я провел полную проверку с FastMM4, и не было ни сбоев стека, ни сбоев кучи, несмотря на то, что некоторые из вызовов DLL получают параметры LongWord, и обычно "out" параметры обычно страдают в первую очередь при несовпадениях интеграции DLL.Кроме того, значения, которые я получаю из C ++ DLL, выглядят правильно.
Если у кого-то есть какие-либо идеи или мысли по этому поводу или, возможно, некоторые косвенные знания, которые могут выявить реальную проблему, если это не проблема приведения,Я хотел бы знать.
Спасибо.