Непонятный краш приложения в Win32

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Аватара пользователя
BadBoyAlex
постоялец
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород
Контактная информация:

Непонятный краш приложения в Win32

Сообщение BadBoyAlex »

Всем привет и всех с Праздником!

Ребят, подскажите, что не так. Есть приложение. Оно нормально работает в Win64, но когда компилирую в Win32, происходит это:
LazarusWin32Error_1.png

LazarusWin32Error_2.png


Что это и как лечить?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

BadBoyAlex писал(а):но когда компилирую в Win32

Компилируете или запускаете программу?
Аватара пользователя
BadBoyAlex
постоялец
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород
Контактная информация:

Сообщение BadBoyAlex »

Vadim писал(а):
BadBoyAlex писал(а):но когда компилирую в Win32

Компилируете или запускаете программу?

Действительно, когда запускаю.
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

BadBoyAlex, запустите приложение под gdb и посмотрите где падает
Аватара пользователя
BadBoyAlex
постоялец
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород
Контактная информация:

Сообщение BadBoyAlex »

Padre_Mortius писал(а):запустите приложение под gdb и посмотрите где падает


А как это сделать-то?
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

Аватара пользователя
Sharfik
энтузиаст
Сообщения: 839
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

BadBoyAlex писал(а):Что это и как лечить?

Больше информации для гадания надо.
dll какие то загружаются в ней?
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

Padre_Mortius писал(а):Как-то так

Интересно, решил испробовать вашу инструкцию и завис. Где скачать файл gdb.exe. Может подскажите? :)
Отсюда http://www.gnu.org/software/gdb/download/
Зашел сюда http://ftp.gnu.org/gnu/gdb/
Скачал архив gdb-7.9.tar.xz
gdb.exe там не могу найти.
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

resident, обычно рядом с fpc лежит в папке bin
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

Padre_Mortius спасиб, нашел в другой папке

Код: Выделить всё

C:\lazarus\mingw\i386-win32\bin
Аватара пользователя
BadBoyAlex
постоялец
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород
Контактная информация:

Сообщение BadBoyAlex »

Итак, вот, что выдаёт GDB:
LazarusError.png


Из разбора понял, что ошибка возникает в вызове DLL, НО! в Win64 работает! Что не так с Win32 понятия не приложу.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

BadBoyAlex, а dll у вас не 64битная?
Аватара пользователя
BadBoyAlex
постоялец
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород
Контактная информация:

Сообщение BadBoyAlex »

Лекс Айрин писал(а):а dll у вас не 64битная?

нет, 32-битная
Аватара пользователя
BadBoyAlex
постоялец
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород
Контактная информация:

Сообщение BadBoyAlex »

После небольшого разбора: крашится от ошибки в обращении к памяти.
Вот процедура в библиотеке:

Код: Выделить всё

procedure MyFmtStr (var VStr: PChar);
var Str: String;
begin
Str:= VStr;
Str:= Format(Str, [1,2,3]);
VStr:= PChar(Str);
end;

Вот в коде:

Код: Выделить всё

function  MyFmtStr (const AStr: String): String;
var DLLInst: THandle;
    MyProc: procedure  (var VStr: PChar);
    Str: PChar;
begin
DLLInst:= SafeLoadLibrary('StrFrmtDll.dll');
@MyProc:= GetProcAddress(DLLInst, 'MyFmtStr');
Result:= AStr;
Str:= PChar(AStr);
try
 MyProc(Str);
 finally
 Result:= Str;
 FreeLibrary(DLLInst);
 end;
end;

//Собсно, сам вызов функции
//...
ShowMessage(MyFmtStr('Мы считали барашков: %d, %d пришли, а вот %d заблудился...'));
//...

Что не так?
kazalex
постоялец
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Сообщение kazalex »

BadBoyAlex писал(а):Что не так?

Ссылка на Str, которая живет только в рамках MyFmtStr.
Ответить