![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос про DLL [D7, XP]
savyhinst © (2008-09-11 17:12:00)Недеццкий вопрос:
Может ли function из DLL возвращать указатели на другие процедуры, хранящиеся в этой DLL?? И если может (а она может), то можно ди будет потом вызвать то, что она возвратит??
Спасибо за внимание.
Сергей М. (2008-09-11 17:45:00) [1]
> так?
Уже лучше.
Но довольно глупо для этой цели реализовать целую функцию, в то время как переменную hp можно инициализировать статически и объявить ее идентификатор прямо в разделе exports
savyhinst (2008-09-11 17:44:00) [2]Сергей М. © (11.09.08 17:43) [17]
действительно... Ошипся
Сергей М. (2008-09-11 17:43:00) [3]
> я в курсе
Ну так а что же ты тогда возвращаешь адрес переменной, зная что она будет уничтожена непосредственно передвозвратом из getProcs ?
savyhinst (2008-09-11 17:43:00) [4]я, кажись, врубился...
var
hp:THPlugin;
function getProcs:PHPlugin;
begin
hp.connect:=@Connect;
result:=@hp;
end;
так?
savyhinst (2008-09-11 17:41:00) [5]да, я в курсе
savyhinst (2008-09-11 17:40:00) [6]Ну вот, уже хоть что-то есть. А как там надо?
Сергей М. (2008-09-11 17:40:00) [7]
> savyhinst © (11.09.08 17:31) [11]
Ты в курсе, что время жизни локальных переменных подпрограмм равно времени жизни (т.е. исполнения) этих подпрограмм ?
Сергей М. (2008-09-11 17:39:00) [8]
> Как быть?
Исправлять грубейшиеошибки в function getProcs:PHPlugin;
savyhinst (2008-09-11 17:31:00) [9]Как быть?
savyhinst (2008-09-11 17:25:00) [10]//---объяв:
const_LoadPluginProcNameA='proc';
THConnectFunc=function(a:pointer):boolean;
THPlugin=record
connect:THConnectFunc;
connect2:THConnectFunc;
end;
PHPlugin=^THPlugin;
TGetPluginFunction=function:PHPlugin;
//---длл:
function Connect(const a:pointer):boolean;
begin
result:=a<>nil;
end;
function getProcs:PHPlugin;
var
hp:THPlugin;
begin
hp.connect:=@Connect;
result:=@hp;
end;
exports
getProcs name const_LoadPluginProcNameA;
//---program
var
p:TGetPluginFunction;
hp:PHPlugin;
begin
h:=LoadLobrary('dll.dll');
if h=0 then ShowMessage('h=0');
p:=GetProcAddress(h,const_LoadPluginProcNameA);
hp:=p();
hp.connect(nil); //тут AV
Jeer (2008-09-11 17:20:00) [11]
> не, тут что-то нетак
Верно, "нетак" пишется "не так".
Также и в остальном - писать надо правильно.
Сергей М. (2008-09-11 17:20:00) [12]
> тут что-то нетак
Эт точно)
savyhinst (2008-09-11 17:19:00) [13]не, тут что-то нетак
stas (2008-09-11 17:18:00) [14]как вызываешь?
Сергей М. (2008-09-11 17:18:00) [15]
> почему тогда у меня не работает?
А у меня работает.
Что я делаю неправильно ?
savyhinst (2008-09-11 17:18:00) [16]возвращает, но при вызове - вездесущий и вечный AccessViolation
www (2008-09-11 17:16:00) [17]не возвращает?
savyhinst (2008-09-11 17:16:00) [18]а почему тогда у меня не работает?
Palladin (2008-09-11 17:13:00) [19]запросто