首页
社区
课程
招聘
[求助]DLL服务问题,也许你也会碰到,进来讨论讨论
发表于: 2010-8-12 10:58 7206

[求助]DLL服务问题,也许你也会碰到,进来讨论讨论

2010-8-12 10:58
7206
最近比较忙,呵呵,有一段时间没上线了,碰到一个问题,请大家帮帮忙,谢谢!!
我用VC写了一个DLL服务,服务可以正常加载,但是弹不出对话框是为什么?
源代码如下:
service.dll
#include "stdafx.h"
#include <windows.h>
#include <wininet.h>
#include <stdio.h>
#include <winbase.h>

#ifdef _MANAGED
#pragma managed(push, off)
#endif

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                                         )
{

    return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif

VOID WINAPI MyHandler(DWORD fdwControl);

SERVICE_STATUS service_status;
SERVICE_STATUS_HANDLE handle;

       
BOOL initService()
{
        return true;
}

VOID WINAPI MyHandler(DWORD fdwControl)
{
        if(fdwControl == SERVICE_CONTROL_STOP){
                service_status.dwWin32ExitCode = 0;
                service_status.dwCurrentState = SERVICE_STOPPED;
        }
        else if(fdwControl == SERVICE_CONTROL_SHUTDOWN){
                service_status.dwWin32ExitCode = 0;
                service_status.dwCurrentState = SERVICE_STOPPED;
        }
        SetServiceStatus(handle,&service_status);
}

VOID WINAPI  ServiceMain(DWORD dwArgc,LPTSTR* lpszArgv)
  {
        service_status.dwCheckPoint = 0;
        service_status.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN|SERVICE_ACCEPT_STOP;
        service_status.dwCurrentState = SERVICE_START_PENDING;
        service_status.dwServiceSpecificExitCode = 0;
        service_status.dwServiceType = SERVICE_WIN32_SHARE_PROCESS;
        service_status.dwWaitHint = 0;
        service_status.dwWin32ExitCode = 0;

        handle = ::RegisterServiceCtrlHandler("DHCP Server",MyHandler);
        if(handle ==(SERVICE_STATUS_HANDLE)0)
        {
                return;
        }
        if(!initService())
        {
                service_status.dwCurrentState = SERVICE_STOPPED;
                service_status.dwWin32ExitCode = -1;
                ::SetServiceStatus(handle,&service_status);
                return;
        }
        service_status.dwCurrentState = SERVICE_RUNNING;
        ::SetServiceStatus(handle,&service_status);
        OutputDebugString("服务启动");
        while(service_status.dwCurrentState == SERVICE_RUNNING)
        {
                OutputDebugString("输出开始");
                MessageBox(NULL,"哈哈","提示",MB_OK);
                OutputDebugString("输出完毕");
        }
       
}

VOID __stdcall Installer()
  {
        SC_HANDLE handle = NULL;
        handle = OpenSCManager(NULL,SERVICES_ACTIVE_DATABASE,SC_MANAGER_ALL_ACCESS);
        if(NULL == handle)
        {
                return;
        }
        if(NULL==::CreateService(handle,"DHCP Server","DHCP Server",SC_MANAGER_ALL_ACCESS,SERVICE_WIN32_SHARE_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,"%SystemRoot%\\system32\\svchost -k ripss",NULL,NULL,NULL,NULL,NULL))
        {
       
        }

          HKEY  hkey = NULL;
          HKEY  pkey = NULL;
        ::RegOpenKey(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\DHCP Server",&hkey);
        if(NULL !=hkey)
        {
                char buff[] = "%SystemRoot%\\system32\\service.dll";
                ::RegCreateKey(hkey,"Parameters",&pkey);
                if(ERROR_SUCCESS != (RegSetValueEx(pkey, "ServiceDll", 0, REG_EXPAND_SZ, (unsigned char*)buff, strlen(buff)+1)))
                {
                }
                ::RegCloseKey(pkey);
                ::RegCloseKey(hkey);
               
                 
        }

    hkey = NULL;
        RegOpenKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SvcHost",&hkey);
        if(hkey != NULL)
        {
                if(ERROR_SUCCESS != ::RegSetValueEx(hkey,"ripss",0,REG_MULTI_SZ,(BYTE*)"DHCP Server",strlen("DHCP Server")+1))
                {
               
                }
                ::RegCloseKey(hkey);

        }

        ::CloseHandle(handle);
       

}

VOID __stdcall Unstaller()
{
        SC_HANDLE handle = NULL;
        SC_HANDLE handle_sv = NULL;
        __try{
                handle = OpenSCManager(NULL,SERVICES_ACTIVE_DATABASE,SC_MANAGER_ALL_ACCESS);
                if(NULL == handle)
                {
                        return;
                }
                handle_sv = OpenService(handle,"DHCP Server",SC_MANAGER_ALL_ACCESS);
                if(NULL == handle_sv)
                {
                        return;
                }
                if(NULL==::DeleteService(handle_sv))
                {
                        return;
                }

                HKEY  hkey = NULL;
            RegOpenKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SvcHost",&hkey);
                if(hkey != NULL)
                {
                        if(ERROR_SUCCESS != ::RegDeleteValue(hkey,"DHCP Server"))
                        {
                        }
                ::RegCloseKey(hkey);

           }

        }__finally
        {
                if(NULL != handle_sv)
                {
                        ::CloseHandle(handle_sv);
                }
                if(NULL != handle)
                {
                ::CloseHandle(handle);
                }
        }
}
my.def
LIBRARY "service"
EXPORTS
ServiceMain @1
Installer       @2
Unstaller      @3
把文件放到系统目录下,然后rundll32 service.dll Installer之后,服务可以正常加载,然后启动服务,但是却不能弹出对话框是为什么?如果把MessageBox那行去掉,在重新加载启动服务,用DebugView看也只能看到“输出开始”和“输出完毕”这两行,却看不到“服务启动”这行,是为什么?很是郁闷啊!!请大哥们帮小弟看看,我试过用汇编却可以运行,不知道为什么?
谢谢大家都来讨论讨论!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 220
活跃值: (711)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我的经验,服务DLL,不能用MessageBox,ShellExecute这2个函数(目前我只发现这2个),希望楼下的补充!·
2010-8-12 18:41
0
雪    币: 347
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
服务程序如果其OWNER是SYSTEM的话,倒是可以通过设置SERVICE_INTERACTIVE_PROCESS标志来与桌面交互。其他的用户基本上都不是同一个Desktop,所以窗口基本都不显示在登录用户的界面上。

详细的信息可以关注一下WinStation, Desktop的相关介绍。系统登录后默认的是WinSta0/Desktop
2010-8-12 20:44
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
话说岂不是只要登录为System就应该能看到效果了...
2010-8-12 23:18
0
雪    币: 233
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
1.服务允许与桌面交互。
2.得获取当前用户的session 或者桌面。

同意3楼观点。
2010-8-16 12:32
0
雪    币: 2323
活跃值: (4113)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
6
谢谢,大家我在试试,呵呵
2010-8-16 13:39
0
雪    币: 363
活跃值: (338)
能力值: ( LV15,RANK:310 )
在线值:
发帖
回帖
粉丝
7
同意3楼的观点!要通过设置SERVICE_INTERACTIVE_PROCESS才能与用户交互!
2010-8-16 15:33
0
游客
登录 | 注册 方可回帖
返回
//