Несовместимость DLL-библиотеки, написанной на FB, с Win7 64-бит
Участников: 2
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Несовместимость DLL-библиотеки, написанной на FB, с Win7 64-бит
Возвращение блудного программиста костылепилителя.
Несколько месяцев назад я создавал на этом форуме тему, в которой просил помощи с написанием одного DLL-плагина.
Ну так вот. Вроде бы все проблемы разрешил, но не тут-то было!
Использующая мой плагин программа, написанная на GameMaker'е, работает некорректно. Результат из DLL'ки иногда не доходит в программу, а иногда даже приводит к её вылету или к Access Violation'у при выходе.
Написанная мною для проверки программа на FB, тоже использующая этот плагин, попросту вылетает при попытке открыть один из файлов. Что самое интересное - другой файл такой же структуры, но чуть меньше размером, она открывает без проблем.
Я уже было отчаялся найти ошибку. НО! Внезапно обнаружилось, что все вышеописанные проблемы загадочным образом пропадают у обеих программ, если я запускаю их в режиме совместимости с Windows XP. И всё работает отлично.
Вот сама DLL'ка, тестовая программа на FB, два файла для проверки и исходные коды всего этого безобразия:
http://rghost.ru/38936219
Программа представляет из себя простенький конвертер, который читает бинарный файл и записывает данные из него в текстовик.
С файлом sdm_binary.dlv у него проблем не возникает. А вот файл geobase_binary.dlv приводит к неминуемому вылету, если не установлен режим совместимости с WinXP.
Имена, еслишо, надо вводить с расширением. Иначе не откроет.
Очень сильно надеюсь на хоть какую-нибудь помощь.
Несколько месяцев назад я создавал на этом форуме тему, в которой просил помощи с написанием одного DLL-плагина.
Ну так вот. Вроде бы все проблемы разрешил, но не тут-то было!
Использующая мой плагин программа, написанная на GameMaker'е, работает некорректно. Результат из DLL'ки иногда не доходит в программу, а иногда даже приводит к её вылету или к Access Violation'у при выходе.
Написанная мною для проверки программа на FB, тоже использующая этот плагин, попросту вылетает при попытке открыть один из файлов. Что самое интересное - другой файл такой же структуры, но чуть меньше размером, она открывает без проблем.
Я уже было отчаялся найти ошибку. НО! Внезапно обнаружилось, что все вышеописанные проблемы загадочным образом пропадают у обеих программ, если я запускаю их в режиме совместимости с Windows XP. И всё работает отлично.
Вот сама DLL'ка, тестовая программа на FB, два файла для проверки и исходные коды всего этого безобразия:
http://rghost.ru/38936219
Программа представляет из себя простенький конвертер, который читает бинарный файл и записывает данные из него в текстовик.
С файлом sdm_binary.dlv у него проблем не возникает. А вот файл geobase_binary.dlv приводит к неминуемому вылету, если не установлен режим совместимости с WinXP.
Имена, еслишо, надо вводить с расширением. Иначе не откроет.
Очень сильно надеюсь на хоть какую-нибудь помощь.
Re: Несовместимость DLL-библиотеки, написанной на FB, с Win7 64-бит
Попробуй так (функция из DLL, замени):
Серьезно потестировать не могу, сам уж давай
- Код:
Dim Shared AS ZString Ptr StrResult
Function rpl_file_read_str GME "rpl_file_read_str" (FileIndex AS Double) AS ZString Ptr Export
If StrResult<>0 Then DeAllocate(StrResult)
Static AS UByte StrBuffer()
Dim AS Integer AddPos = 1
Do While EOF(FileIndex) = 0
Redim Preserve StrBuffer(1 To AddPos)
Get #CInt(FileIndex), , StrBuffer(AddPos)
If CHR(StrBuffer(AddPos)) = CHR(0) Then Exit Do 'null
If CHR(StrBuffer(AddPos)) = CHR(13) Then Exit Do 'next
If CHR(StrBuffer(AddPos)) = CHR(10) Then Exit Do 'bspace
If CHR(StrBuffer(AddPos)) = CHR(26) Then Exit Do 'eof
AddPos += 1
Loop
StrResult = 0: StrResult = CAllocate(AddPos+1)
For Cycle AS Integer = 0 To AddPos - 1
StrResult[Cycle] =Chr(StrBuffer(Cycle + 1))
Next Cycle
Print #64, "Read STRING from file"; FileIndex; " RW"; Seek(FileIndex); " | "; *StrResult
function = StrResult
End Function
Серьезно потестировать не могу, сам уж давай
trew- Сообщения : 331
Дата регистрации : 2010-10-14
Re: Несовместимость DLL-библиотеки, написанной на FB, с Win7 64-бит
trew, уважаемый, у меня к вам всего один вопрос: в чём суть изменений?) Потому что ЗАРАБОТАЛО!!1
Спасибо вам огромное, я уже отчаялся запустить эту штуку.
Спасибо вам огромное, я уже отчаялся запустить эту штуку.
Re: Несовместимость DLL-библиотеки, написанной на FB, с Win7 64-бит
Black Doomer пишет:trew, уважаемый, у меня к вам всего один вопрос: в чём суть изменений?) Потому что ЗАРАБОТАЛО!!1
Спасибо вам огромное, я уже отчаялся запустить эту штуку.
Если сравнить две процедуры, наверно самому видно станет. Если коротко, запись в место памяти, незарезервированное системой для программы + переполнение памяти. Да, при получении строк из процедур, нужно помнить, что последующий вызов процедуры уничтожит прошлую строку. Поэтому сейчас данный тестовый исходник будет показывать не совсем то что нужно. Лучшим вариантов будет при получении тоже выделять память для принимаемой строки.
trew- Сообщения : 331
Дата регистрации : 2010-10-14
Re: Несовместимость DLL-библиотеки, написанной на FB, с Win7 64-бит
Эта ошибка появлялась и тогда, когда был Deallocate там.trew пишет:Если сравнить две процедуры, наверно самому видно станет. Если коротко, запись в место памяти, незарезервированное системой для программы + переполнение памяти.
А вот в чём разница между CAllocate и Allocate? И почему незарезервированное?
Когда GameMaker получает строки, он копирует их к себе в память. Так что можно смело освобождать память при каждом вызове.trew пишет:Да, при получении строк из процедур, нужно помнить, что последующий вызов процедуры уничтожит прошлую строку. Поэтому сейчас данный тестовый исходник будет показывать не совсем то что нужно. Лучшим вариантов будет при получении тоже выделять память для принимаемой строки.
Re: Несовместимость DLL-библиотеки, написанной на FB, с Win7 64-бит
Эта ошибка появлялась и тогда, когда был Deallocate там.
А вот в чём разница между CAllocate и Allocate? И почему незарезервированное?
В программе испольуется прямая запись в память [] и при этом неправильно рассчитан размер для выделямой памяти (скорее всего и я тоже на один символ ошибся) . Так что в строке
CAllocate(AddPos+1)
Желательно прибавить еще как минимум на единичку, хуже не будет.
Когда была попытка записи символа "0" для строки, это в конце концов привело к краху. Разница между CAllocate и Allocate в том что первая заполняет буфер нулями. Для строк и структур бывает очень полезно.
trew- Сообщения : 331
Дата регистрации : 2010-10-14
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|