2013-05-11 3 views
3

У меня есть часть оборудования, которое обрабатывается с использованием компонента ActiveX в Delphi. Если я отброшу этот компонент в моей форме во время разработки, все будет хорошо. Однако, если я создаю его динамически во время выполнения с помощью Creat (Self), дальнейшее выполнение метода вызывает нарушение доступа в файле mfc100.dll. Код очень прост:Создание компонента ActiveX во время выполнения приводит к нарушению доступа

uses 
    Windows, Messages, ... 
    OleCtrls, MG17MotorLib_TLB; // <-- The latter is the hardware driver 

type 
    TForm1 = class(TForm) 
    motorX: TMG17Motor; 
    ... 
    end; 

... 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    motorX := TMG17Motor.Create(Self); 
    motorX.HWSerialNum := 94835472; 
    motorX.StartCtrl; // <--- This causes AV in mfc100.dll 
end; 

TMG17Motor класс является потомком TOleControl и поставляется производителем оборудования.

Я могу ошибаться в динамическом создании объекта ActiveX, или он скорее похож на ошибку в классе TMG17Motor? Возможно, есть способ обмануть и создать объект класса TMG17Motor так же, как это делает приложение, если я избегу использовать Create (Self), отбросив элемент управления в форме во время разработки?

P.S. Причина, по которой я хочу иметь возможность динамически создавать элемент управления, - это то, что я хочу переместить код для аппаратной обработки в рабочий поток.

+0

Возможно/вероятно, что элемент управления имеет определенную зависимость (например, он ожидает наличия родительского свойства или чего-то подобного). Если у вас есть источник или символы для целевого элемента управления, должно быть просто посмотреть в отладчике, чтобы узнать, что именно запускает AV. – EricLaw

+0

Я бы поговорил с продавцом. http://www.thorlabs.com/newgrouppage9.cfm?objectgroup_id=2419 Также попробуйте сбросить DFM и установить ВСЕ свойства точно так, что вы видите в DFM. –

+0

@ EricLaw: Спасибо за идею! Я не думал о зависимостях. Попробует посмотреть в этом направлении. – Ilya

ответ

5

Я приложил все усилия, чтобы загрузить программное обеспечение и посмотреть, в чем проблема. Похоже, что TMG17Motor - это визуальный контроль. Поэтому ваша проблема возникает из-за того, что у вашего компонента нет родительского окна.

Исправление очень легко:

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    motorX := TMG17Motor.Create(Self); 
    motorX.Parent := Self; // <--- you need this! 
    // set other properties... 
    motorX.HWSerialNum := 94835472; 
    motorX.Align := alclient; 
    motorX.StartCtrl; 
end; 

скриншот Пример: enter image description here Вы заявляете в вашем вопросе, который вы хотите переместить свой код в рабочий поток, но это визуальный контроль так, выигравшей» возможно. Попробуйте связаться с Thorlabs и посмотреть, если у них есть другие средства, чтобы добиться того, что вы хотите ...

EDIT

Как предложил Дэвид в комментариях, вы можете попробовать с не окнами VCL и рабочим потоком. Поскольку это объект ActiveX, убедитесь, что вы вызываете CoInitialize (nil)/CoUninitialize в методе Execute вашего рабочего потока.

+0

+1 Хорошая работа. Должно быть хорошо, чтобы перейти к рабочей нити. Поместите его в окно, отличное от VCL. –

+0

@whosrdaddy: Большое вам спасибо! Неожиданное решение, так как строка выше также отправляет родителя. – Ilya

+0

@ Давид Хеффернан: Спасибо за подсказку о не-VCL-окне! Я был уверен, что для этого нужно работать! – Ilya

Смежные вопросы