Заметил, что COM-сервер с потоковой моделью tmApartment работает так, будто у него модель tmSingle. Проверял в Delphi 7. Cделал тестовый пример:
1. Создал COM-объект с единственным методом, возвращающим ИД потока, в котором он выполнен.
2. Подключился к серверу двумя клиентами. Создалось 2 объекта. Теоретически, они должны существовать в разных потоках, т.к. модель tmApartment.
3. Клиенты вызывают метод сервера, который возвращает идентификатор главного потока .
Как заставить сервер работать в модели tmApartment?
Код сервера:
type
TApServer = class(TAutoObject, IApServer)
protected
function GetThreadID: Integer; safecall;
end;
implementation
uses ComServ, Windows;
function TApServer.GetThreadID: Integer;
begin
Result := GetCurrentThreadID;
end;
initialization
TAutoObjectFactory.Create(ComServer, TApServer, Class_ApServer,
ciMultiInstance, tmApartment);
Код клиента:
type
TForm3 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
FServer: Variant;
end;
var
Form3: TForm3;
implementation
procedure TForm3.FormCreate(Sender: TObject);
begin
FServer := CreateOLEObject('ApartmentServer.ApServer');
end;
procedure TForm3.Button1Click(Sender: TObject);
begin
MessageDlg(IntToStr(FServer.GetThreadID), mtWarning, [mbOK], 0);
end;