暂停DLL导出,直到由EXE触发

暂停DLL导出,直到由EXE触发,dll,inter-process-communicat,pausing-execution,Dll,Inter Process Communicat,Pausing Execution,有人知道如何让DLL函数等待“输入”,以及如何调用DLL导出的特定实例吗 我正在尝试将Windows服务转换为DLL。它包含一个函数,该函数记录一些启动信息,然后等待通知退出。日志功能已经完成,但我需要解决两个问题 在执行其主要功能后,导出需要坐在那里等待(就像经典的按任意键继续…,但不包括界面) 我需要一种方法,让一个可执行文件随后告诉暂停的实例该退出了 对于第一个问题,我考虑进入一个循环并等待某种触发器,但当然它不应该进入100%的CPU周期,所以可能是WaitForSingleObjec

有人知道如何让DLL函数等待“输入”,以及如何调用DLL导出的特定实例吗


我正在尝试将Windows服务转换为DLL。它包含一个函数,该函数记录一些启动信息,然后等待通知退出。日志功能已经完成,但我需要解决两个问题

  • 在执行其主要功能后,导出需要坐在那里等待(就像经典的
    按任意键继续…
    ,但不包括界面)
  • 我需要一种方法,让一个可执行文件随后告诉暂停的实例该退出了
  • 对于第一个问题,我考虑进入一个循环并等待某种触发器,但当然它不应该进入100%的CPU周期,所以可能是
    WaitForSingleObject
    ,或者可能是等待消息(例如WM_APP)


    第二,我想到了某种进程间通信,但希望不要像共享内存或信号量那样混乱(我在uni的Unix中使用了共享mem、信号量、信号等,但这是在Windows上)。当然,我需要一种访问被调用导出的特定实例的方法。

    您可以使用CreateEvent、SetEvent和WaitForSingleObject。如果dll是由需要向事件发送信号的可执行文件加载的,则只需发送信号即可。如果它来自不同的可执行文件,则只会稍微复杂一点。调用CreateEvent时,创建一个命名事件。此命名事件可由多个进程访问。如果它需要在登录的不同用户之间工作,请在名称前面加上“Global\”前缀,对于所有用户的所有进程,它将是相同的事件

    //in dll
    HANDLE eventHandle = CreateEvent( NULL, TRUE, FALSE, "Global\\My-Unique-Trigger-Event" );
    //do stuff
    WaitForSingleObject( eventHandle, INFINITE);
    //exit
    
    //in executable
    HANDLE eventHandle = CreateEvent( NULL, TRUE, FALSE, "Global\\My-Unique-Trigger-Event" );
    SetEvent( eventHandle );
    

    听起来很有希望。DLL确实是从另一个进程(操作系统)调用的,需要稍后由一个单独的EXE命令退出。是的,我使用了类似的方法(尽管我在EXE中使用了
    OpenEvent(EVENT\u MODIFY\u STATE…
    ,而不是
    CreateEvent
    )。我用
    rundll32
    对它进行了测试,看起来两个部分都在工作。现在我只需要重新启动并检查它是否按预期工作。谢谢!