FreeBasic
Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.

Несовместимость DLL-библиотеки, написанной на FB, с Win7 64-бит

Участников: 2

Перейти вниз

Несовместимость DLL-библиотеки, написанной на FB, с Win7 64-бит Empty Несовместимость DLL-библиотеки, написанной на FB, с Win7 64-бит

Сообщение  Black Doomer Сб Июн 30, 2012 5:37 am

Возвращение блудного программиста костылепилителя.
Несколько месяцев назад я создавал на этом форуме тему, в которой просил помощи с написанием одного DLL-плагина.
Ну так вот. Вроде бы все проблемы разрешил, но не тут-то было!
Использующая мой плагин программа, написанная на GameMaker'е, работает некорректно. Результат из DLL'ки иногда не доходит в программу, а иногда даже приводит к её вылету или к Access Violation'у при выходе.
Написанная мною для проверки программа на FB, тоже использующая этот плагин, попросту вылетает при попытке открыть один из файлов. Что самое интересное - другой файл такой же структуры, но чуть меньше размером, она открывает без проблем.
Я уже было отчаялся найти ошибку. НО! Внезапно обнаружилось, что все вышеописанные проблемы загадочным образом пропадают у обеих программ, если я запускаю их в режиме совместимости с Windows XP. И всё работает отлично.
Вот сама DLL'ка, тестовая программа на FB, два файла для проверки и исходные коды всего этого безобразия:
http://rghost.ru/38936219
Программа представляет из себя простенький конвертер, который читает бинарный файл и записывает данные из него в текстовик.
С файлом sdm_binary.dlv у него проблем не возникает. А вот файл geobase_binary.dlv приводит к неминуемому вылету, если не установлен режим совместимости с WinXP.
Имена, еслишо, надо вводить с расширением. Иначе не откроет.

Очень сильно надеюсь на хоть какую-нибудь помощь.

Black Doomer

Сообщения : 27
Дата регистрации : 2011-08-23

http://doom2d.org/forum/viewforum.php?f=19

Вернуться к началу Перейти вниз

Несовместимость DLL-библиотеки, написанной на FB, с Win7 64-бит Empty Re: Несовместимость DLL-библиотеки, написанной на FB, с Win7 64-бит

Сообщение  trew Сб Июн 30, 2012 7:43 am

Попробуй так (функция из 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

Вернуться к началу Перейти вниз

Несовместимость DLL-библиотеки, написанной на FB, с Win7 64-бит Empty Re: Несовместимость DLL-библиотеки, написанной на FB, с Win7 64-бит

Сообщение  Black Doomer Сб Июн 30, 2012 11:02 am

trew, уважаемый, у меня к вам всего один вопрос: в чём суть изменений?) Потому что ЗАРАБОТАЛО!!1
Спасибо вам огромное, я уже отчаялся запустить эту штуку.

Black Doomer

Сообщения : 27
Дата регистрации : 2011-08-23

http://doom2d.org/forum/viewforum.php?f=19

Вернуться к началу Перейти вниз

Несовместимость DLL-библиотеки, написанной на FB, с Win7 64-бит Empty Re: Несовместимость DLL-библиотеки, написанной на FB, с Win7 64-бит

Сообщение  trew Сб Июн 30, 2012 1:24 pm

Black Doomer пишет:trew, уважаемый, у меня к вам всего один вопрос: в чём суть изменений?) Потому что ЗАРАБОТАЛО!!1
Спасибо вам огромное, я уже отчаялся запустить эту штуку.

Если сравнить две процедуры, наверно самому видно станет. Если коротко, запись в место памяти, незарезервированное системой для программы + переполнение памяти. Да, при получении строк из процедур, нужно помнить, что последующий вызов процедуры уничтожит прошлую строку. Поэтому сейчас данный тестовый исходник будет показывать не совсем то что нужно. Лучшим вариантов будет при получении тоже выделять память для принимаемой строки.

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Вернуться к началу Перейти вниз

Несовместимость DLL-библиотеки, написанной на FB, с Win7 64-бит Empty Re: Несовместимость DLL-библиотеки, написанной на FB, с Win7 64-бит

Сообщение  Black Doomer Сб Июн 30, 2012 1:27 pm

trew пишет:Если сравнить две процедуры, наверно самому видно станет. Если коротко, запись в место памяти, незарезервированное системой для программы + переполнение памяти.
Эта ошибка появлялась и тогда, когда был Deallocate там.
А вот в чём разница между CAllocate и Allocate? И почему незарезервированное?
trew пишет:Да, при получении строк из процедур, нужно помнить, что последующий вызов процедуры уничтожит прошлую строку. Поэтому сейчас данный тестовый исходник будет показывать не совсем то что нужно. Лучшим вариантов будет при получении тоже выделять память для принимаемой строки.
Когда GameMaker получает строки, он копирует их к себе в память. Так что можно смело освобождать память при каждом вызове.

Black Doomer

Сообщения : 27
Дата регистрации : 2011-08-23

http://doom2d.org/forum/viewforum.php?f=19

Вернуться к началу Перейти вниз

Несовместимость DLL-библиотеки, написанной на FB, с Win7 64-бит Empty Re: Несовместимость DLL-библиотеки, написанной на FB, с Win7 64-бит

Сообщение  trew Сб Июн 30, 2012 1:49 pm

Эта ошибка появлялась и тогда, когда был Deallocate там.
А вот в чём разница между CAllocate и Allocate? И почему незарезервированное?

В программе испольуется прямая запись в память [] и при этом неправильно рассчитан размер для выделямой памяти (скорее всего и я тоже на один символ ошибся) . Так что в строке

CAllocate(AddPos+1)

Желательно прибавить еще как минимум на единичку, хуже не будет.

Когда была попытка записи символа "0" для строки, это в конце концов привело к краху. Разница между CAllocate и Allocate в том что первая заполняет буфер нулями. Для строк и структур бывает очень полезно.

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Вернуться к началу Перейти вниз

Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения