【发布时间】:2013-05-11 15:28:28
【问题描述】:
我有一个使用 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;
TMG17Motor 类是 TOleControl 的后代,由硬件生产商提供。
我在动态创建 ActiveX 对象时犯了一个错误,还是看起来像是 TMG17Motor 类中的错误?也许,如果我通过在设计时删除表单上的控件来避免使用 Create(Self),是否有一种方法可以欺骗并以与应用程序相同的方式创建 TMG17Motor 类的对象?
附:我希望能够动态创建控件的原因是我想将用于硬件处理的代码移至工作线程。
【问题讨论】:
-
控件有可能/很可能有一些依赖关系(例如,它希望有一个父属性集或类似的东西)。如果您有目标控件的源代码或符号,那么在调试器中查看具体触发 AV 的内容应该很简单。
-
我会和供应商谈谈。 thorlabs.com/newgrouppage9.cfm?objectgroup_id=2419 另外,尝试转储 DFM 并将所有属性设置为与您在 DFM 中看到的完全相同。
-
@EricLaw:谢谢你的想法!我没有考虑依赖关系。将尝试朝那个方向看。
-
@Warren P:是的,我已经通知了 Thorlabs 这个问题。还没有回应。
-
任何控件的设计时和运行时实例化之间最显着的区别之一是运行时创建绕过流系统,这意味着不会调用
Loaded方法。如果您有源代码,请检查您的 ActiveX 组件是否覆盖了 Loaded 方法。如果有,在创建组件之后和设置任何其他属性之前调用它可能会有所帮助。