バックグラウンド スレッドで作成された ADORecordset
オブジェクトがあります。
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は、オブジェクトを作成していないアパートメント (この場合はthreads )からの COM オブジェクトへのアクセスを禁止します。
アパートメントの境界を越えてインプロセスCOM オブジェクト インターフェイスをマーシャリングする正しい方法は何ですか?