Есть решение?

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

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

Сообщение SovNarKom » 24.04.2006 06:19:47

Код: Выделить всё
rogram testing;
uses Classes;
interface
type
PGetStr = function (indx: integer): string;
var
ExGetStr: PGetStr; external name 'GetStr';
FileWithStrings: TStringList;

implementation
function GetStr(indx: integer): string;
begin
result:=FileWithString.Strings[indx];
end;

begin
FileWithStrings:=TStringLisr.Create;
FileWithStrings.LoadFromFile('testing.pas');
ExGetStr:=@GetStr;
test;
FileWithStrings.Free;
end.


Ты хочешь чтобы это ещё и скомпилировалось??? Я наверное с утра совсем ничего не понимаю, но это невозможно ни в одном языке реализовать... Этож ужас . Библиотека и программа ониж не телепаты, они не могут по имени различать классы... тут проблема в общей идеологии того что ты хочешь...

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

Эээ.... а она сейчас что работает, или хотябы компилируется? :blink:

Калбеки они да, они хорошие. Суть: В библиотеку передаётся адрес на процедуру в программе и библиотека вызывает ей при необходимости, например так реализованы таймеры WinAPIшные.
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение zub » 24.04.2006 07:49:39

Ты хочешь чтобы это ещё и скомпилировалось??? Я наверное с утра совсем ничего не понимаю, но это невозможно ни в одном языке реализовать... Этож ужас . Библиотека и программа ониж не телепаты, они не могут по имени различать классы... тут проблема в общей идеологии того что ты хочешь...

а что тут такого, помоему к него какраз и получилась калбак функция. передавай в test @GetStr и используй shortstring или pchar, всё должно работать.
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Сообщение Saemon Zixel » 24.04.2006 10:26:02

2zub
передавай в test @GetStr и используй shortstring или pchar, всё должно работать.

В том и прикол что нихрена не работает, и информации в инете на эту тему я не нашол, и в документации по freepascal тоже не написано как это делать.
Хоть было бы описание миханизма вызовов между прогой и библеотекой. :(

2SovNarKom
Эээ.... а она сейчас что работает, или хотябы компилируется?

Ну без вотетой фигни, нормально компилится и работает. Главная начинка до переделки в библеотеку писалась и отлаживалась как программа в Lazarus-е (только без обьектов, кроме форм и кнопочек). Так-что лезть в главный код я точно не буду :angry: .

PS+Hint Во всех экспортируемых подрограммах используется cdecl, PChar, integer, boolean;
Более того есть функции каторые делают только SetLength динамическим структурам.
Saemon Zixel
новенький
 
Сообщения: 78
Зарегистрирован: 20.09.2005 18:19:54
Откуда: Sochi

Сообщение zub » 24.04.2006 10:48:27

>>В том и прикол что нихрена не работает
у меня работает
>>Более того есть функции каторые делают только SetLength динамическим структурам.
этого не должно быть, может изза этого и неработает
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Сообщение Saemon Zixel » 24.04.2006 23:04:00

>>В том и прикол что нихрена не работает
у меня работает

Это как поподробнее можно. Такой-же текст? какой компилятор? какие опции?

>>Более того есть функции каторые делают только SetLength динамическим структурам.
этого не должно быть, может изза этого и неработает

Спецально для проверки сказанного закаментировал всё что связано с SetLength и прцедурами использующих их, пересобрал, заработало :blink: . Раскаментировал всё обратно, пересобрал, тоже заработало :blink: . Что-то я совсем запутался, веть вчера не работало. Сяду ка я хорошенько всё осматрю и переправерю... о результатах отпишусь.

PS Zub ты походу дела сдвинул планеты в благоприятные места для моей программы и всё заработало :)
Saemon Zixel
новенький
 
Сообщения: 78
Зарегистрирован: 20.09.2005 18:19:54
Откуда: Sochi

Сообщение zub » 24.04.2006 23:11:41

Меня гложет подозрение что вчера ты компилировал exe и dll с разными опциями компилятора
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Сообщение SovNarKom » 24.04.2006 23:51:31

Так, ладно забуду про тот пример...
Ты SetMemoryManager используешь?
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение zub » 25.04.2006 00:14:47

>>Так, ладно забуду про тот пример...
Что там такого убийственного?
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Сообщение SovNarKom » 25.04.2006 00:19:33

zub

ExGetStr:=@GetStr;
test;
FileWithStrings.Free;

Так вот test это что такое вообще? Она в примере в библиотеке только объявлена.
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение zub » 25.04.2006 00:26:44

да, необратил внимание. видимо определение test из первого примера запомнилось:)
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Сообщение Saemon Zixel » 25.04.2006 01:15:01

SovNarKom писал(а): ExGetStr:=@GetStr;
test;
FileWithStrings.Free;

Так вот test это что такое вообще? Она в примере в библиотеке только объявлена.

О да, извиняюсь. Надо добавить экспорт функции, (уже добавил).
Просто я за основу взял придыдущий пример и недоглядел.
Saemon Zixel
новенький
 
Сообщения: 78
Зарегистрирован: 20.09.2005 18:19:54
Откуда: Sochi

Сообщение SovNarKom » 26.04.2006 00:15:37

И импорт....
function test(p: pointer; flag: boolean):string; cdecl; external 'libtest.so';

Тогда точно гляди в сторону Get/SetMemoryManager...
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Пред.

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

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

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

Рейтинг@Mail.ru