Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.14;
Скачать: CL | DM;

Вниз

вызов из dll процедуры, выдающей массив   Найти похожие ветки 

 
Grief ©   (2005-06-21 17:44) [0]


 Res = array of array of record
   Name: string;
   Proc: procedure;
 end;

Вот это описание имеется как в библиотеке dll так и в главной проге exe.

Вот это только в главной проге:

procedure TForm1.Button1Click(Sender: TObject);
var
 J: Res;
 Lib: HWnd;
 Proc: function: Res;
begin
 Lib := LoadLibrary("Operators.dll");
 Proc := GetProcAddress(Lib, "GetOperators");
 J := Proc;
 FreeLibrary(Lib);
end;

Вот это находится в библиотеке:

procedure PR;
begin
 MessageBox(0,0,0,0);
end;

function GetOperators: Res;
begin
 SetLength(Result, 1, 1);
 Result[0,0].Name := "fuck!";
 Result[0,0].Proc := PR;
end;


Почему ошибка?! Как я понял, все работает нормально, а ошибка выдается в тот момент, когда переменная J уничтожается - перед выходом, если переменная глобальная и в конце процедуры Button1Click если она, как и выше, локаьная.

Мастера, помогите, где у меня в ДНК ошибка? :)


 
Игорь Шевченко ©   (2005-06-21 17:47) [1]

uses Sharemem


 
Digitman ©   (2005-06-21 17:51) [2]


> где у меня в ДНК ошибка


именно в том звене, которое ответственно за чтение документации, находящейся прямо перед носом, и в чтении ОГРОМНОГО комментария, который делфи вставляет в текст dpr-файла будущей библиотеки, заготовка которой создается при File-New-Library


 
Grief ©   (2005-06-21 18:03) [3]

блин, а что такое Sharemem, я читал, я всегда перед удаленеем комментариев (смейтесь, но мне так легче - без них) их читаю. Так для чего же оно нужно?


 
Grief ©   (2005-06-21 18:07) [4]

Точнее, как оно работает. Я думал - фигня. Я вроде строки раньше просто преедавал. без всяких.


 
Игорь Шевченко ©   (2005-06-21 18:29) [5]


> Я думал - фигня


Правильно думал. Все фигня, кроме пчел. Забей.


 
Grief ©   (2005-06-21 19:18) [6]

Хе хе, а честно, для чего?


 
alpet ©   (2005-06-21 19:28) [7]

Этот модуль позволяет и приложению и библиотеке(dll) использовать один и тот же менеджер кучи (динамической памяти), поэтому в программах с его участием не возникает разногласий по поводу удаления некоторой строки созданой в dll при попытке удаления ее в главном модуле (exe). Использование данного юнита обязывает программу подключать при запуске библиотеку borlndmm.dll. Если не хочется таскать ее со своим приложением, лучше обратить внимание на  альтернативы, например FastShareMem.


 
alpet ©   (2005-06-21 19:31) [8]

Если все кажется слишком сложным, попробуй заменить string на что-нибудь типа type TStr = array [0..63] of char, и избегай использования в DLL строк и переменных, память под которые выделяется автоматически (и также автоматически освобождается).


 
Grief ©   (2005-06-21 21:59) [9]

А вообще, что является аналогом сишных строк? Я вот знаю винда под си писалась, посему наверное стандартные строки си являются стандартом в виндовс?


 
Digitman ©   (2005-06-22 08:19) [10]


> что является аналогом сишных строк?


если имеется ввиду

char * MyStringData

то

MyStringData: PChar


 
Grief ©   (2005-06-22 20:52) [11]

То есть PCHar все таки стандарт? А для длинных строк? Ведь насколько япомню PChar - только короткие? Или нет?


 
Fay ©   (2005-06-22 21:13) [12]

Grief ©   (22.06.05 20:52) [11]
PChar - указатель. Какие "длинные", какие "короткие"?!


 
Grief ©   (2005-06-22 22:08) [13]

он помоему указывает на короткие строки. На длинные разве не PAnsiChar?



Страницы: 1 вся ветка

Текущий архив: 2005.08.14;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.041 c
3-1120627489
Тучудище
2005-07-06 09:24
2005.08.14
FibPlus 5.3.0 Release не работает LookupCache:=true??


14-1121789262
atruhin
2005-07-19 20:07
2005.08.14
Почему все известные прокси хранят кэш в файлах а не в БД


14-1122200731
P.N.P.
2005-07-24 14:25
2005.08.14
Работа операторов :))


5-1092994745
sirin
2004-08-20 13:39
2005.08.14
expert


4-1119625527
TStas
2005-06-24 19:05
2005.08.14
Как заставить приложение грузиться с нужным языком?