imho.ws |
![]() |
![]() |
![]() |
# 1 |
Guest
Сообщения: n/a
|
DLL написанная на С++ в Delphi
У меня появились проблемы с использованием библиотеки DLL.
Описание проблемы: 1. Есть библиотека dll в которой хеш-функция получает адрес строки, обрабатывает её и возвращает уже хеш-код. Библиотека написана на С++ с использованием MFC. 2.1. Если эту библиотеку использует программа написанная на С++, то всё проходит нормально. 2.2. Вот объявление хеш-функфии в программе CString __stdcall EXPORT HASH(CString *NAME);2.3. Вот код вызова хеш-функции из программы CString StrPass;3.1. Если же эту библиотеку использует программа написанная на Delphi, то если на обработку хеш-функцией подавать адрес строки длинной меньше 4-ёх символов, то всё проходит нормально. 3.2. Вот объявление функфии в программе function HASH(Pass: Pointer):string;StdCall;3.3. Вот код вызова хеш-функции из программы var4. Если же символов в подаваемой строке будет 4 и более, то на каждый, так сказать, лишний символ выдаётся два окна ошибки (Microsoft Visual C++ Debug Library), оба со следующим текстом: Debug Assertion Failed!5. Если в окнах ошибок нажать "Пропустить", то библиотека возврашает правильный результат, т.е. такой же что и в случае с программой написанной на С++. 6. Я нашел файл afx.inl и вот что нашел в строке 177 (строки указаны): 173 _AFX_INLINE TCHAR CString::operator[](int nIndex) const7. А самое интересное, что если в хеш-функцию (переделанную немного) передавать путь к файлу где находится наша строка, то уже в библиотеке прочитав строку из файла и сделав хеш-код, всё проходит отлично, что в случае с програмой на С++, что на Delphi. Причём даже возвращая хеш-код через файл и просто возвращая. Вопрос: Почему для 3 и менее символов всё работает, а для большего колличества - НЕТ? Если кто знает, помогите решить проблему ![]() |
![]() |
# 2 |
Junior Member
Регистрация: 19.04.2002
Адрес: Дом
Пол: Male
Сообщения: 187
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Скорее всего проблемы с выделением памяти.
Если мне не изменяет память, то CString имеет маленький статический буфер для коротких строк, а если строка длинее этого буфера, то используется динамическия память. Проблема может быть (и скорее оно так и есть) в несовместимости рантаймов вызываемой функции и вызывающей. Использование MFC классов для внешних интерфейсов не самая хорошая идея. Почему бы не использовать TCHAR* и PCHAR (delphi)? void __stdcall EXPORT hash(TCHAR* inStr, TCHAR* outStr); Понятно что тогда нужно самому контролировать размеры и т.п.
__________________
Дураки не динозавры - они не вымрут... |
![]() |
![]() |
# 5 |
Junior Member
Регистрация: 19.04.2002
Адрес: Дом
Пол: Male
Сообщения: 187
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Я сделал логичное предположение
solarian CString из MFC, да и вообще MFC вещь сама в себе и потому не очень дружит с внешними вещами. А строки не совместимы на 100% в паскале String вида <размер <строки>сама строка>, а в C++ все строки это строки с завершающим нулем. И то что когда-то это работает - сущей воды везение. В общем char*/TCHAR* решают все проблемы, потому что это нативные типы. Вы бы еще stl::string засунули в паскаль.
__________________
Дураки не динозавры - они не вымрут... |
![]() |