如何将dll作为服务运行
How to run a dll as a service?
我知道如何编写一个dll,如何编写一个服务,以及如何与rundll32
运行一个dll,但现在我想编写一个dll安装在windows
我不知道这是否可能或dll中的哪个函数应该导出?
如何将dll作为服务安装和运行?
将DLL作为服务运行有几种不同的方法。
-
写你自己的。exe服务,让它加载你需要的DLL。
-
使用微软的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服务使用。相反,开发者应该实现自己的服务托管程序。
-
将服务编写为内核模式驱动程序,导出
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
- Active Directory:从网络服务帐户下运行的Windows服务调用ADsOpenObject时失败
- 从运行服务的应用程序代码中提取窗口句柄
- 在 Linux 上C++:在作为 systemd 服务运行时侦听键盘输入
- 将 Visual C++ 6 控制台应用程序作为 Windows 服务运行
- 使用C++在同一系统上运行的 2 个服务之间进行通信
- 当程序作为服务运行时重定向 std::cout
- 在 Windows 7 中从 Windows 服务运行 DLL/EXE 程序
- 我可以将一个可执行文件与另一个可执行文件(Windows 服务程序)组合在一起,并将该程序作为逻辑服务运行吗?
- 作为服务运行时连接到远程计算机的 WMI
- OpenSSL 在作为 win32 服务运行时SSL_CTX_new崩溃
- 获取当前登录的用户名,C++作为服务运行时不显示任何内容
- 使用 init.d 将C++程序作为服务运行
- 作为windows服务运行时,如何获取活动监视器的数量?C++
- 如何从作为服务运行的c++程序访问当前登录的用户信息
- 当java作为服务运行时,从java启动进程
- 保持ATL服务运行的最佳方法是什么?
- 在自动化服务部署时设置用户服务运行的最佳实践是什么?
- 从服务运行程序
- 在c++中将可执行文件作为服务运行
- 如何将dll作为服务运行