Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как из библиотеки передать списки (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 используешь, как дедушка Борланд завещал?


Наверх

Титульная страница Поиск, карта сайта Написать письмо