我希望我能很好地解释这个问题!
我正在尝试将ReWire音频设备实现为Delphi .dll。如果你不知道ReWire是什么,不要担心它。重要的是,我的代码编译成一个.dll,我收到来自ReWire系统的调用到我的.dll中,打开一个显示器,检查显示器是否打开,然后再次关闭它。
当我接到启动电话时,我会做以下几件事:
if not Assigned(form) then
form := TMyForm.Create(nil);
form.Show;在我的Delphi库中,form是一个全局变量(可能是个问题?)我连接了MyForm的OnCreate事件来做一些有趣的事情,比如准备一组我想要处理的东西。
到目前为止一切都很好。我的表单中有一个小按钮,可以打开一个TOpenDialog。我发现一旦对话框关闭,OnCreate事件就会以我的形式再次触发!
我检查过OnDestroy没有被调用,所以我不知道为什么要再次调用OnCreate。
不幸的是,我并不确定哪些信息是相关的,但是下面是第一次调用堆栈(当表单第一次设置时):

正如预期的那样,ReWire正在调用我的.dll来启动Panel应用程序,所以我创建了我的表单。很好,一切看起来都很好。
然后在表单中打开一个小对话框,选择一个文件,并执行一些操作。在左侧字段中,再次调用OnCreate,下面是调用堆栈:

这是个疯狂的电话派对!Reaper (在底部)是我用来测试我的应用程序的ReWire主机,但是我不知道堆栈跟踪中发生了什么,因为没有一个是我的代码。突然间,当我认为不应该这样做的时候,这个事件就会被调用,因为OnDestroy甚至没有被调用。
我唯一能想到的另一件重要的事情是,如果我打印出Sender的地址,每次都是不同的,所以它是以某种方式再次创建的,但是我检查了一下,我只调用了一次MyForm.Create。
对于这类事情的发生有什么想法吗?
发布于 2012-04-30 04:30:15
在第一个堆栈跟踪中,OnCreate调用前面是对TCustomForm.Create()的调用,这是正确的行为。在第二个堆栈跟踪中,OnCreate调用前面是对TObject.Create()的调用,这是不正确的行为。这导致我认为,按钮OnClick事件处理程序中的某些内容要么是用错误的VMT构造对象,要么是以其他方式破坏内存,从而导致错误地跳入刚好被TForm类占用的代码。无论哪种方式,都要检查您的OnClick逻辑是否存在bug。
发布于 2012-04-30 02:50:48
检查将表单变量设置为零的(任意)。可能是在没有释放所指向的表单的情况下将其设置为零,因此下次调用启动代码时,它将创建表单的另一个实例。
https://stackoverflow.com/questions/10377786
复制相似问题