Форум: "Основная";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];
ВнизМногопоточность и Property Page - не дружат? Найти похожие ветки
← →
WondeRu © (2006-01-30 11:56) [0]Здравствуйте!
уде 4 дня бьюсь с непонятным глюком:
1. Сделал COM-объект (tmFree)
2. добавил страницу свойств TPPage
3. добавил COM-объекту интерфейс ISpecifyPropertyPages
4. У вызывающего приложения "сделал" мультипоточностьbegin
CoInitFlags := COINIT_MULTITHREADED;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
5. пытаюсь показать эту страницу свойств
Результат:
Приложение виснет наглухо. Если убираю CoInitFlags := COINIT_MULTITHREADED, то все показывается замечательно, но, к сожалению, эта строчка критична!OleCheck(CoCreateInstance(
AGUID,
nil,
CLSCTX_INPROC_SERVER,
IPropertyPage,
FPropertyPage));
OleCheck(FPropertyPage.SetObjects(1, @ABase));
OleCheck(FPropertyPage.SetPageSite(Self));
OleCheck(FPropertyPage.GetPageInfo(PropPageInfo));
OleCheck(FPropertyPage.Activate(Handle, Rect(0, 0, PropPageInfo.size.cx, PropPageInfo.size.cy), False));
OleCheck(FPropertyPage.Show(SW_SHOW)); //Тут происходит зависание
если убираем OleCheck(FPropertyPage.Activate(..., то страница свойств показывается и даже реагирует на действия, но в каком-то "левом" месте и не принадлежит форме.
какое посоветуете решение?
← →
Digitman © (2006-01-30 12:13) [1]
> 1. Сделал COM-объект (tmFree)
Визуальные VCL-контролы в нем используешь ?
Если используешь, то придерживайся общего для любых VCL-приложений (будь то "обычное" приложение или СОМ-приложение) правил : обращения к VCL-контролам в контексте НЕосновного трэда процесса VCL-приложения недопустимы, ибо непотокобезопасны
← →
WondeRu © (2006-01-30 13:22) [2]Digitman © (30.01.06 12:13) [1]
удалил все VCL компоненты с TPropertyPage,удалил все лишние uses, но все-равно зависает(
← →
Digitman © (2006-01-30 13:39) [3]
> WondeRu © (30.01.06 13:22) [2]
TPropertyPage - это наследник TCustomForm !
А форма - это точно такой же равноправный VCL-компонент, как и те которые ты удалил)
← →
WondeRu © (2006-01-30 14:04) [4]Digitman © (30.01.06 13:39) [3]
а как решать проблему? я хочу именно VCL использовать?
← →
WondeRu © (2006-01-30 14:23) [5]Заработало! пришлось изменить стандартную реализацию создания фабрики класса для PropertyPage, ибо по умолчанию она всегда создает объект с моделью tmSingle.
Я создал классTActiveXPropertyPageFactory2 = class(TComObjectFactory)
public
constructor Create(ComServer: TComServerObject;
PropertyPageClass: TPropertyPageClass; const ClassID: TGUID);
function CreateComObject(const Controller: IUnknown): TComObject; override;
end;
{ TActiveXPropertyPageFactory2 }
constructor TActiveXPropertyPageFactory2.Create(ComServer: TComServerObject;
PropertyPageClass: TPropertyPageClass; const ClassID: TGUID);
begin
inherited Create(ComServer, TComClass(PropertyPageClass), ClassID,
"", Format("%s property page", [PropertyPageClass.ClassName]),
ciMultiInstance, tmFree); // изменение выделено
end;
function TActiveXPropertyPageFactory2.CreateComObject(const Controller: IInterface): TComObject;
begin
Result := TActiveXPropertyPage.CreateFromFactory(Self, Controller);
end;
а затемinitialize
переделал под свою реализациюTActiveXPropertyPageFactory2.Create(
ComServer,
TfpPAge,
Class_fpPAge);
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.013 c