Winapi Windows服务编程

Winapi Windows服务编程,winapi,service,Winapi,Service,我正在编写一个windows服务,我需要将一些参数传递到该服务中,有人知道我会怎么做吗 int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { SERVICE_TABLE_ENTRY svcTable[2] = {0}; svcTable[0].lpServiceName = (LPWSTR)svcName.c_str(); sv

我正在编写一个windows服务,我需要将一些参数传递到该服务中,有人知道我会怎么做吗

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    SERVICE_TABLE_ENTRY svcTable[2] = {0};
    svcTable[0].lpServiceName = (LPWSTR)svcName.c_str();
    svcTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)TRPC::ServiceMain;

    std::wstring* str = new std::wstring(TEXT("Hello World"));

//  I want to pass say, str in argv[0];

    StartServiceCtrlDispatcher(svcTable);
}

void TRPC::ServiceMain(DWORD argc, LPWSTR* argv)
{
    Access argv here...
}

ServiceMain是类中的一个静态定义,以符合u stdcall,但我要做的是在调用StartServiceCtrlDispatcher()之前用我自己的一组分配字符串填充agrv,这样我就可以在方法中使用参数。有什么想法吗?

服务控制管理器在启动服务时从
启动服务CtrlDispatcher()
中调用
ServiceMain()
。将参数传递给
ServiceMain()
本身的唯一方法是:

  • 启动服务时,单击服务属性对话框中的“启动”按钮,将参数放入SCM UI(控制面板中的“服务”小程序)。但是,这些参数不是持久的。一旦关闭UI,它们将被丢弃

  • 在您自己的应用程序代码中调用
    StartService()
    函数

  • 替代方案是:

  • 将命令行参数放入服务注册中,然后服务可以在需要时使用
    GetCommandLine()

  • 将值放在某个地方—注册表、数据库、INI/XML文件等—服务可以在需要时访问


  • 服务的参数是从服务外部提供的。在我看来,你对这件事感到困惑。您似乎认为源于代码的参数可能是在
    StartServiceCtrlDispatcher
    之前使用
    ChangeServiceConfig
    并在那里更改二进制路径。。。