![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как из библиотеки передать списки (TList)? [D7, WinXP]
sutyt © (2006-12-27 16:05:00)Доброго дня мастера. Прежде всего - ВСЕХ с наступающим Новым Годом!!! Желаю крепкого здоровья, много счастья и любви, и побольше творчесских успехов!!!
Вызываю функцию из длл, которая показывает окно прогресса, но главное - это передача выходных параметров типа TList.
ДЛЛ:
function CompileTGStatistic(AHandle:THandle;AFileName:PChar;
var MainList:TList;var DetailList:TList;var Done:boolean):LongInt;stdcall;
impl-ion
function CompileTGStatistic(AHandle:THandle;AFileName:PChar;
var MainList:TList;var DetailList:TList;var Done:boolean):LongInt;
{var
PostProcFm:TPostProcFm;}
begin
Application.Handle:=AHandle;
PostProcFm:=TPostProcFm.Create(Application);
Result:=LongInt(PostProcFm);
with PostProcFm do
begin
GlobalCancel:=false;
Button2.Enabled:=false;
end;
MainList:=TList.Create;
DetailList:=TList.Create;
PostProcFm.Show;
PostProcFm.TGCompiling(StrPas(AFileName));
with PostProcFm do begin
if ResultMasterList<>nil then
begin
MainList.Capacity:=ResultMasterList.Count;
MainList.Assign(ResultMasterList);
end else
MainList:=nil;
if ResultDetailList<>nil then
begin
DetailList.Capacity:=ResultDetailList.Capacity;
DetailList.Assign(ResultDetailList);
end else
DetailList:=nil;
if (DetailList.Count=0)or(MasterList.Count=0) then Done:=false
else
Done:=true;
end;
end;
Проверял по брекпоинтам - списки заполнены (MasterList=38, DetailList=1296)
главная прога:
type
TCompileTGStatistic=function(AHandle:THandle;AFileName:PChar;
var MainList:TList;var DetailList:TList;var Done:boolean):LongInt;stdcall;
...
procedure TMainFm.Button2Click(Sender: TObject);
var
CompileTGStatistic:TCompileTGStatistic;
LibHandle:THandle;
MasterList:TList;
RDetailList:TList;
FFileName:string;
FormRef:LongInt;
ADone:boolean;
begin
if Opn1.Execute then
begin
FFileName:=Opn1.FileName;
LibHandle:=LoadLibrary('TgcompProc.dll');
try
if LibHandle=0 then
begin
Raise Exception.Create('Unable to load TgcompProc.dll');
exit;
end;
@CompileTGStatistic:=GetProcAddress(LibHandle,'CompileTGStatistic');
if not(@CompileTGStatistic=nil)then
begin
MasterList:=TList.Create;
RDetailList:=TList.Create;
FormRef:=CompileTGStatistic(Application.Handle,PChar(FFileName),MasterList,RDeta ilList,ADone);
if ADone then
begin
ShowMessage('MasterList:'+IntToStr(MasterList.Count)+#13#10+
'DetailList:'+IntToStr(RDetailList.Count))
end else
ShowMessage('Fatal Error');
end else
RaiseLastWin32Error;
finally
FreeLibrary(LibHandle);
end;
end;//if Opn1.execute;
end;
Так вот - MasterList=38 а RDetailList=0!!!!
Что я не так делаю???
Сергей М. (2006-12-28 10:13:00) [1]
> function CompileTGStatistic(AHandle:THandle;AFileName:PChar;
>
> varMainList:TList; varDetalList:TList;var Done:boolean):
> LongInt; stdcall;
>
Выделенное жирным - лишнее.
sutyt (2006-12-28 09:42:00) [2]в [6] уже исправлено, но было одинаково.
sutyt (2006-12-28 09:41:00) [3]>All
у меня в приватах длл-ки и в описании ф-ии были одинаковые имена.
private
{ Private declarations }
MasterData:PGeneralData;
DetailData:PDetailData;
Addon:PAdditionalData;
ResultMasterData:PResultMasterData;
FindList:TList;
FindData:PFindData;
ResultMasterList:TList;
ResultDetailList:TList;
MasterList:TList;
DetailList:TList;
AddonList:TList;
ComposeData:PComposeData;
function CompileTGStatistic(AHandle:THandle;AFileName:PChar;
var MainList:TList;var DetalList:TList;var Done:boolean):LongInt;stdcall;
теперь все ОК, и без глючного ШареМем!
Германн (2006-12-27 19:05:00) [4]
> Не помогло
А как делал?
sutyt (2006-12-27 18:47:00) [5]>[3]Джо © (27.12.06 18:39)
Не помогло, а при закрытии формы из длл - вообще заглючило...
Джо (2006-12-27 18:39:00) [6]> [2] sutyt (27.12.06 18:38)
> >Джо[1]
> Нет.
А нужно.
sutyt (2006-12-27 18:38:00) [7]>Джо[1]
Нет. Но первый то передается!
Джо (2006-12-27 18:30:00) [8]ShareMem используешь, как дедушка Борланд завещал?