如何将dll作为服务运行

How to run a dll as a service?

本文关键字:服务 运行 dll      更新时间:2023-10-16

我知道如何编写一个dll,如何编写一个服务,以及如何与rundll32运行一个dll,但现在我想编写一个dll安装在windows

我不知道这是否可能或dll中的哪个函数应该导出?

如何将dll作为服务安装和运行?

将DLL作为服务运行有几种不同的方法。

  1. 写你自己的。exe服务,让它加载你需要的DLL。

  2. 使用微软的SVCHOST.EXE来托管您的DLL。让您的DLL导出ServiceMain()功能,将ServiceDLL值添加到您的服务的注册表项以指向您的DLL,将您的服务名称添加到SVCHOST的注册表项中的新组,然后将svchost -k <GroupName>设置为您的服务的可执行文件。有关更多详细信息,请参阅这些文章:

    Svchost.exe的描述

    SVCHOST.EXE疑难解答

    SVCHOST.EXE的技巧

    服务主机

    请注意,MSDN的服务程序文档警告不要使用这种方法:

    以SERVICE_WIN32_SHARE_PROCESS类型创建的服务程序包含多个服务的代码,使它们能够共享代码。这样做的服务程序的一个示例是通用服务主机进程Svchost.exe,它承载内部Windows服务。请注意,Svchost.exe保留供操作系统使用,不应由非windows服务使用。相反,开发者应该实现自己的服务托管程序。

  3. 将服务编写为内核模式驱动程序,导出DriverEntry()函数,并在指向DLL文件的服务的注册表键中添加ServiceDLL值。更多详细信息请参阅本文:

    Driver Development Part 1: Introduction to Drivers.

    我不推荐这种方法,除非您正在设计自己的硬件。

不能使用rundll32.exe作为主机可执行文件实际上没有内在的原因,尽管不建议使用rundll32。(进一步说:我猜你是想把建立DLL服务作为学术练习,这很好。在生产环境中,您当然应该使用EXE,就像您已经做过的那样。

你的main函数应该有这样的签名:

void CALLBACK MyServiceEntry(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow)

和应该调用StartServiceCtrlDispatcher,就像在传统服务中调用main()WinMain()函数一样。

然后安装该服务以使用以下命令行:

rundll32 MyService.dll,MyServiceEntry

对于学术练习,使用Remy回答中描述的svchost.exe也是可以接受的,但更重要的是不要在生产环境中使用它:支持第三方使用rundll32,但不建议使用;不支持第三方使用svhost