у меня есть ADO Recordset
объект, который создается в фоновом потоке:Как передать набор записей ADO (или любой объект COM) через границы потоков?
var
conn: TADOConnection;
rs: _Recordset;
begin
conn := CreateDatabaseConnection();
rs := conn.Execute(CommandText, cmdText, []);
conn.Free;
//Give the recordset to the UI thread
//Don't forget to add a reference before we stuff it into a 32-bit variable
rs._AddRef();
PostMessage(hwndUIThreadWindow, WM_HeresTheRecordsetYouAskedFor, WPARAM(rs), 0);
end;
И тогда Recordset
передается на мой «основной» нить:
procedure ExecuteComplete(var msg: TMessage); message WM_HeresTheRecordsetYouAskedFor;
var
rs: _Recordset;
begin
rs := _Recordset(msg.wParam);
//don't forget to remove the manually added reference
rs._Release();
ShowMessage(rs.Fields['TheTimeIs'].Value);
end;
я также мог бы сделать :
var
global_Recordset: _Recordset;
var
conn: TADOConnection;
begin
conn := CreateDatabaseConnection();
global_Recordset := conn.Execute(CommandText, cmdText, []);
conn.Free;
end;
В любом случае, нить, которая не создал объект COM, который использует его. Из основной резьбы:
global_Recordset .Fields['TheTimeIs'].Value;
COM запрещает доступ к COM-объекты из квартир (в данном случае: темы), которые не создают объект.
Что такое правильно способ маршала в в процессе интерфейсов COM объектов через границу квартиры?
Не совсем ответ, но выглядят немного дальше и передать данные, которые вы хотите, а не COM-объект ... – whosrdaddy
@whosrdaddy звучит как хороший ответ мне. –
@whosrdaddy Представьте, что я сохранил свои данные сопряженной переменной. Тот же вопрос. –