Multithreading CreateEvent在线程中使用时失败(Delphi XE+;)
我创建了一个内核模式驱动程序,并在其中做了一些事情。 我有一个用Delphi编写的用户模式应用程序,名为Multithreading CreateEvent在线程中使用时失败(Delphi XE+;),multithreading,delphi,events,kernel,driver,Multithreading,Delphi,Events,Kernel,Driver,我创建了一个内核模式驱动程序,并在其中做了一些事情。 我有一个用Delphi编写的用户模式应用程序,名为MyApp,用于与驱动程序和MyApp进行通信 我必须在Driver和MyApp之间使用Event sharing方法 我用一根线来做这项工作。在线程的构造函数中,我使用CreateEvent创建了一个用户模式事件: ... var xxx:THandle; .... xxx:=CreateEvent(nil, False, False, nil); 并将其传递给我的驱动程序并进行验证 但
MyApp
,用于与驱动程序和MyApp
进行通信
我必须在Driver
和MyApp
之间使用Event sharing
方法
我用一根线来做这项工作。在线程的构造函数中,我使用CreateEvent
创建了一个用户模式事件:
...
var xxx:THandle;
....
xxx:=CreateEvent(nil, False, False, nil);
并将其传递给我的驱动程序并进行验证
但当创建此事件时,该事件的句柄无效,当我尝试使用该事件时,不会发生任何错误或异常:
procedure TMyThread.Execute;
begin
while Active do
begin
if WaitForSingleObject(xxx, INFINITE) <> WAIT_FAILED then
begin
Synchronize(DoSomething)
end
else
begin
RaiseLastOSError;
Break;
end;
Sleep(1);
end;
end;
事件的句柄(xxx
)是有效的句柄
编辑:
当我使用Delphi7时,xxx句柄是有效的!仅在XE+中无效。
编辑我的代码
请注意,我必须使用线程,并且必须在MyThread
中创建事件。
有什么想法吗
(如果我的英语不好,请原谅)
句柄无效
-如何确定句柄的有效性?我在内核模式下验证句柄@JensG在内核中使用ObReferenceObjectByHandle
可以确定从use land传递的句柄是否有效。我想问题最终在于驱动程序和用户应用程序运行的上下文。我建议您切换到可以在进程之间共享的命名事件。查看@KenWhite谢谢,我编辑了我的代码;)
procedure TfrmMain.FormCreate(Sender: TObject);
Var
xxx::THandle;
begin
xxx:=CreateEvent(nil, False, False, nil);
end;