如何运行dll作为服务?

时间:2015-05-31 05:29:04

标签: c++ c winapi dll service

我知道如何编写dll以及如何编写服务以及如何使用rundll32运行dll,但现在我想编写一个在Windows中作为服务安装的DLL

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

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

2 个答案:

答案 0 :(得分:4)

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

  1. 编写您自己的.exe服务,并根据需要加载您的DLL。这是推荐的方法。

  2. 使用Microsoft的SVCHOST.EXE来托管您的DLL。让您的DLL导出ServiceMain()函数,将ServiceDLL值添加到服务的注册表项以指向您的DLL,将您的服务名称添加到SVCHOST的注册表项中的新组,然后设置{{1作为您服务的可执行文件。有关详细信息,请参阅这些文章:

    A description of Svchost.exe

    Getting Started with SVCHOST.EXE Troubleshooting

    Tricks with SVCHOST.EXE

    The Service Host

    但请注意,MSDN的Service Programs文档警告此方法:

      

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

  3. 将您的服务编写为导出DriverEntry()函数的内核模式驱动程序,并在服务的注册表项中添加svchost -k <GroupName>值,指向DLL文件。有关更多详细信息,请参阅此文章:

    Driver Development Part 1: Introduction to Drivers

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

答案 1 :(得分:3)

尽管使用了rundll32 isn't recommended,但实际上并没有使用rundll32.exe作为主机可执行文件的固有原因。 (为了扩展这一点:我收集你并试图建立一个DLL服务作为学术练习,这很好。在制作中,你当然应该使用EXE,就像你已经完成的那样。)< / p>

您的主要功能应have this signature

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

并且应该调用StartServiceCtrlDispatcher,方式与传统服务中的main()WinMain()功能相同。

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

rundll32 MyService.dll,MyServiceEntry

对于学术练习,使用Remy的答案中描述的svchost.exe也是可以接受的,但更重要的是不要在生产环境中使用它:使用rundll32 by第三方得到支持但不推荐;明确不支持第三方使用svchost。