![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
вызов из dll процедуры, выдающей массив [D7, WinXP]
Grief © (2005-06-21 17:44:00)
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 если она, как и выше, локаьная.
Мастера, помогите, где у меня в ДНК ошибка? :)
Grief (2005-06-22 22:08:00) [1]он помоему указывает на короткие строки. На длинные разве не PAnsiChar?
Fay (2005-06-22 21:13:00) [2]Grief © (22.06.05 20:52) [11]
PChar - указатель. Какие "длинные", какие "короткие"?!
Grief (2005-06-22 20:52:00) [3]То есть PCHar все таки стандарт? А для длинных строк? Ведь насколько япомню PChar - только короткие? Или нет?
Digitman (2005-06-22 08:19:00) [4]
> что является аналогом сишных строк?
если имеется ввиду
char * MyStringData
то
MyStringData: PChar
Grief (2005-06-21 21:59:00) [5]А вообще, что является аналогом сишных строк? Я вот знаю винда под си писалась, посему наверное стандартные строки си являются стандартом в виндовс?
alpet (2005-06-21 19:31:00) [6]Если все кажется слишком сложным, попробуй заменить string на что-нибудь типа type TStr = array [0..63] of char, и избегай использования в DLL строк и переменных, память под которые выделяется автоматически (и также автоматически освобождается).
alpet (2005-06-21 19:28:00) [7]Этот модуль позволяет и приложению и библиотеке(dll) использовать один и тот же менеджер кучи (динамической памяти), поэтому в программах с его участием не возникает разногласий по поводу удаления некоторой строки созданой в dll при попытке удаления ее в главном модуле (exe). Использование данного юнита обязывает программу подключать при запуске библиотеку borlndmm.dll. Если не хочется таскать ее со своим приложением, лучше обратить внимание на альтернативы, например FastShareMem.
Grief (2005-06-21 19:18:00) [8]Хе хе, а честно, для чего?
Игорь Шевченко (2005-06-21 18:29:00) [9]
> Я думал - фигня
Правильно думал. Все фигня, кроме пчел. Забей.
Grief (2005-06-21 18:07:00) [10]Точнее, как оно работает. Я думал - фигня. Я вроде строки раньше просто преедавал. без всяких.
Grief (2005-06-21 18:03:00) [11]блин, а что такое Sharemem, я читал, я всегда перед удаленеем комментариев (смейтесь, но мне так легче - без них) их читаю. Так для чего же оно нужно?
Digitman (2005-06-21 17:51:00) [12]
> где у меня в ДНК ошибка
именно в том звене, которое ответственно за чтение документации, находящейся прямо перед носом, и в чтении ОГРОМНОГО комментария, который делфи вставляет в текст dpr-файла будущей библиотеки, заготовка которой создается при File-New-Library
Игорь Шевченко (2005-06-21 17:47:00) [13]uses Sharemem