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

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

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

SovNarKom
постоялец
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]
Контактная информация:

Сообщение SovNarKom »

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

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шные.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

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

а что тут такого, помоему к него какраз и получилась калбак функция. передавай в test @GetStr и используй shortstring или pchar, всё должно работать.
Saemon Zixel
новенький
Сообщения: 78
Зарегистрирован: 20.09.2005 18:19:54
Откуда: Sochi

Сообщение Saemon Zixel »

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

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

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

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

PS+Hint Во всех экспортируемых подрограммах используется cdecl, PChar, integer, boolean;
Более того есть функции каторые делают только SetLength динамическим структурам.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

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

Сообщение Saemon Zixel »

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

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

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

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

PS Zub ты походу дела сдвинул планеты в благоприятные места для моей программы и всё заработало :)
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Меня гложет подозрение что вчера ты компилировал exe и dll с разными опциями компилятора
SovNarKom
постоялец
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]
Контактная информация:

Сообщение SovNarKom »

Так, ладно забуду про тот пример...
Ты SetMemoryManager используешь?
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

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

Сообщение SovNarKom »

zub

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

Так вот test это что такое вообще? Она в примере в библиотеке только объявлена.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

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

Сообщение Saemon Zixel »

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

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

О да, извиняюсь. Надо добавить экспорт функции, (уже добавил).
Просто я за основу взял придыдущий пример и недоглядел.
SovNarKom
постоялец
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]
Контактная информация:

Сообщение SovNarKom »

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

Тогда точно гляди в сторону Get/SetMemoryManager...
Ответить