我知道如何编写dll以及如何编写服务以及如何使用rundll32
运行dll,但现在我想编写一个在Windows中作为服务安装的DLL
我不知道是否可能导出dll或导出dll中的哪个函数?
如何安装和运行dll作为服务?
答案 0 :(得分:4)
将DLL作为服务运行有几种不同的方法。你可以:
编写您自己的.exe服务,并根据需要加载您的DLL。这是推荐的方法。
使用Microsoft的SVCHOST.EXE来托管您的DLL。让您的DLL导出ServiceMain()
函数,将ServiceDLL
值添加到服务的注册表项以指向您的DLL,将您的服务名称添加到SVCHOST的注册表项中的新组,然后设置{{1作为您服务的可执行文件。有关详细信息,请参阅这些文章:
Getting Started with SVCHOST.EXE Troubleshooting
但请注意,MSDN的Service Programs文档警告此方法:
使用SERVICE_WIN32_SHARE_PROCESS类型创建的服务程序包含多个服务的代码,使它们能够共享代码。执行此操作的服务程序示例是通用服务主机进程Svchost.exe,它承载内部Windows服务。 请注意,Svchost.exe保留供操作系统使用,非Windows服务不应使用。相反,开发人员应该实施自己的服务托管程序。
将您的服务编写为导出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。