ошибка после использования динам библиотеки

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

ошибка после использования динам библиотеки

Сообщение azatsh » 24.08.2010 11:56:21

Здравствуйте! Я пишу программу на Lazarus. В моей программе я использую написанную мной динамическую библиотеку. Библиотека написана на языке С. Теперь попытаюсь объяснить в чем ошибка... Если я вызываю функцию из библиотеки в которой я делаю изменения данных в памяти, а потом в программе хочу прочитать данные по тому самому адресу, то в конце процедуры, после end'а, выходит ошибка! Именно в конце процедуры, когда все действия выполнились без ошибок! Я не понимаю.. Причем под виндами все работает. Не работает только в Linux. Приведу маленький пример:

Код: Выделить всё
//libMy.so
#include <stdlib.h>
#define EXPORT extern "C"

EXPORT int myalloc(int **dest, int n)
{
    **dest = n;
    return 1;
}


Код: Выделить всё
type
pInt = ^Integer;
tfunc = function (var dest: pInt; n: Integer): Integer; stdcall;

procedure TForm1.Button1Click(Sender: TObject);
type pbyte = ^byte;
var
  b: byte;
  ptr: pointer;
  h: pointer;
  func: tfunc;
begin
  h := dlopen(pchar('libMy.so'), RTLD_LAZY);
  func := tfunc(dlsym(h, pchar('myalloc')));
  getmem(ptr,4);
  pInt(ptr)^ := #0;
  func(ptr, 2);
  ShowMessage(inttostr(pInt(ptr)^)); // например вызовем это
  pInt(ptr)^ := 34;
  move(ptr^,pchar(@b)^,1);             // или вот это
  caption := inttostr(b);
  freemem(ptr);
  dlclose(h);
end;                                           // тогда после end ошибка


Если не выполнять чтение памяти (убрать строчки ShowMessage и move) то все в порядке!

Кто мне может обьяснить в чем чудеса??
azatsh
новенький
 
Сообщения: 33
Зарегистрирован: 20.07.2010 10:14:04

Re: ошибка после использования динам библиотеки

Сообщение .wOvAN » 24.08.2010 12:09:21

у меня были проблемы с подключением библиотек правда под виндой, подключаешь библиотеку а затем появляются внезапные косяки в программе. помогло ручное обновление установки лазаруса, просто распаковал инсталлятор и вручную заменил в инсталляционном каталоге, и все наладилось, видимо при обновлении не все фалйы обновлялись коррекно.

хотя линукс дело другое но все же попытайтесь распаковать (rpm или deb) и обновить вручную.
.wOvAN
постоялец
 
Сообщения: 118
Зарегистрирован: 16.04.2010 06:36:12

Re: ошибка после использования динам библиотеки

Сообщение azatsh » 24.08.2010 12:31:29

Я думаю может стоит попробовать подключить библиотеку статически. Создал стат библ с расширением .a.
Делаю так:

Код: Выделить всё
{$linklib libmy.a}
  function myalloc(var dest: pInt; n: Integer): Integer; external;

implemenattion

procedure TForm1.Button1Click(Sender: TObject);
begin
..........
myalloc(dest,2);
end;


Но при компиляции ругается что не смог найти ф-ию myalloc
azatsh
новенький
 
Сообщения: 33
Зарегистрирован: 20.07.2010 10:14:04

Re: ошибка после использования динам библиотеки

Сообщение Mr.Smart » 24.08.2010 12:48:28

stdcall замените на cdecl
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: ошибка после использования динам библиотеки

Сообщение azatsh » 24.08.2010 13:15:40

пробовал! не помогает
azatsh
новенький
 
Сообщения: 33
Зарегистрирован: 20.07.2010 10:14:04

Re: ошибка после использования динам библиотеки

Сообщение Mr.Smart » 24.08.2010 14:09:38

Операционка случаем не 64 битная?

Добавлено спустя 44 секунды:
в смысле код
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: ошибка после использования динам библиотеки

Сообщение azatsh » 24.08.2010 14:58:55

нет, 32 битная!
у меня возник еще один вопрос.. оказывается при выделении определенного кол-ва памяти процедурой GetMem тоже выходит ошибка. Я посмотрел сколько есть свободной памяти (GetMemoryManager и HeapStatus), так он мне пишет что около двух мегабайт!( А мне надо много, очень много!

Добавлено спустя 2 часа 34 минуты 51 секунду:
Проблему решил! Всем спасибо!))
azatsh
новенький
 
Сообщения: 33
Зарегистрирован: 20.07.2010 10:14:04

Re: ошибка после использования динам библиотеки

Сообщение Little_Roo » 24.08.2010 20:52:00

azatsh писал(а):нет, 32 битная!
у меня возник еще один вопрос.. оказывается при выделении определенного кол-ва памяти процедурой GetMem тоже выходит ошибка. Я посмотрел сколько есть свободной памяти (GetMemoryManager и HeapStatus), так он мне пишет что около двух мегабайт!( А мне надо много, очень много!

Добавлено спустя 2 часа 34 минуты 51 секунду:
Проблему решил! Всем спасибо!))

И как решил?
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 639
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: ошибка после использования динам библиотеки

Сообщение azatsh » 26.08.2010 10:46:33

Действительно нужно было писать вместо stdcall cdecl. И к тому же у меня была еще ошибка в другом месте. Вот..)
azatsh
новенький
 
Сообщения: 33
Зарегистрирован: 20.07.2010 10:14:04


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

Рейтинг@Mail.ru