gpt4 book ai didi

delphi - 在运行时创建 ActiveX 组件会导致访问冲突

转载 作者:行者123 更新时间:2023-12-03 15:27:19 28 4
gpt4 key购买 nike

我有一个硬件,它是使用 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 类的对象?

附注我希望能够动态创建控件的原因是我想将硬件处理代码移至工作线程。

最佳答案

我费了好大劲才下载了这个软件,看看问题出在哪里。看起来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,看看他们是否有其他方法来实现你想要的......

编辑

正如 David 在评论中建议的那样,您可以尝试使用非 VCL 窗口和工作线程。由于这是一个 ActiveX 对象,因此请确保在工作线程的 Execute 方法中调用 CoInitialize(nil)/CoUninitialize。

关于delphi - 在运行时创建 ActiveX 组件会导致访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16498738/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com