我有一个硬件设备需要在Delphi中使用ActiveX组件进行处理。如果我在设计时将该组件拖放到表单上,一切正常。然而,如果我在运行时使用Creat(Self)动态创建它,执行方法会导致mfc100.dll中的访问冲突。这段代码非常简单:
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;
我在动态创建ActiveX对象时犯了错误,还是TMG17Motor类看起来更像是一个bug?也许,如果我避免使用Create(Self)在设计时将控件放在表单上,就可以以与应用程序相同的方式创建TMG17Motor类的对象。
P.S. 我想能够动态创建控件的原因是我希望将硬件处理代码移动到工作线程中。
Loaded
方法。如果你有源代码,请检查你的ActiveX组件是否已重写了Loaded
方法。如果已经重写,那么在创建组件并设置其他属性之前调用该方法可能会有所帮助。 - Marjan VenemaMG17MotorLib_TLB
的源代码,其中定义了TMG17Motor
类。Loaded
方法在那里没有被覆盖。此外,motorX.Loaded
未定义,因此该方法在某种程度上不存在。 - Ilya