C++写的服务中的dll的有关问题,跪求大神

C++写的服务中的dll的问题,跪求大神
写的服务中要调用一个DLL,然后这个DLL里又要调用另一个DLL,我测试了下,第一个DLL能加载也有功能,但是DLL里面的DLL能加载但是没有运行其功能。代码如下。
C/C++ code
#include "stdafx.h"
#include <Windows.h>
#include <fstream>
using namespace std;

//ksrecord
typedef int(* lpHookCNProc)(void); //宏定义函数指针类型
HINSTANCE hDll; //DLL句柄

BOOL IsInstalled();
BOOL Install();
void Init();
TCHAR szServiceName[] = _T("测试");
SERVICE_STATUS testServiceStatus;
SERVICE_STATUS_HANDLE testServiceStatusHandle;
void SvcDebugOut(LPSTR String,DWORD Status);
void WINAPI testServiceCtrlHandler(DWORD opcode);
void WINAPI testServiceStart(DWORD argc,LPTSTR *argv);
//DWORD testSerciveInitialization(DWORD argc,LPTSTR *argv,DWORD *specificError);
VOID ServerProgram(DWORD, LPTSTR *); //服务主程序   


int _tmain(int argc, _TCHAR* argv[])
{
    Init();
    SERVICE_TABLE_ENTRY DispatchTable[] = 
    {
        {szServiceName,(LPSERVICE_MAIN_FUNCTION)testServiceStart},
        {NULL,NULL}
    };
    Install();
    if(!StartServiceCtrlDispatcher(DispatchTable))
    {
        SvcDebugOut("[TESTSRV_SERVICE]StartServiceCtrlDispatcher %ld\n",GetLastError());
    }
    return 0;
}

void WINAPI testServiceStart(DWORD argc,LPTSTR *argv)
{
    DWORD status;
    DWORD specificError = 0;
    testServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
    testServiceStatus.dwCurrentState = SERVICE_START_PENDING;
    testServiceStatus.dwControlsAccepted 
        = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_PAUSE_CONTINUE;

    testServiceStatusHandle = RegisterServiceCtrlHandler(
        szServiceName,
        testServiceCtrlHandler);
    if(testServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
    {
        SvcDebugOut("[TESTSRV_SERVICE]RegisterServiceCtrlHandler failed %d\n",GetLastError());
        return;
    }
    testServiceStatus.dwWin32ExitCode = S_OK;
    testServiceStatus.dwCheckPoint = 0;  
    testServiceStatus.dwWaitHint = 0;  
    testServiceStatus.dwCurrentState = SERVICE_RUNNING;
    if(!SetServiceStatus(testServiceStatusHandle, &testServiceStatus))
    {
        status = GetLastError();
        SvcDebugOut("[TESTSRV_SERVICE]SetServiceStatus error %ld\n",status);
    }
    SvcDebugOut("[TESTSRV_SERVICE]Returning the Main Thread \n",0);
    //运行的函数
    ServerProgram(argc,argv);
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    testServiceStatus.dwCurrentState = SERVICE_STOPPED;  
    SetServiceStatus(testServiceStatusHandle, &testServiceStatus);
    return;
}

void ServerProgram(DWORD argc, LPTSTR *argv)
{
    lpHookCNProc SetKBHookCn; //函数指针
    hDll = LoadLibrary("KRecorder.dll");//krecorder中还调用了一个Dll
    if (hDll != NULL)
    {
        SetKBHookCn = (lpHookCNProc)GetProcAddress(hDll, "StartKRecorder");
        if (SetKBHookCn != NULL)
        {
            SetKBHookCn();
        }    
    }
    Sleep(100000000);
     FreeLibrary(hDll);
}

void Init()
{
    testServiceStatusHandle = NULL;
    testServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
    testServiceStatus.dwCurrentState = SERVICE_STOPPED;
    testServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
    testServiceStatus.dwWin32ExitCode = 0;
    testServiceStatus.dwServiceSpecificExitCode = 0;
    testServiceStatus.dwCheckPoint = 0;
    testServiceStatus.dwWaitHint = 0;
}

void WINAPI testServiceCtrlHandler(DWORD opcode)
{
    DWORD status = 0;
    switch(opcode)
    {
    case SERVICE_CONTROL_STOP:  
        testServiceStatus.dwCheckPoint = 0;  
        testServiceStatus.dwWaitHint = 0;  
        testServiceStatus.dwCurrentState = SERVICE_STOPPED;
        testServiceStatus.dwWin32ExitCode = 0;
        if(!SetServiceStatus(testServiceStatusHandle,&testServiceStatus))
        {
            SvcDebugOut("[TESTSRV_SERVICE]SetServiceStatus error %ld\n",status);
        }
        return ;
        break;  
    case SERVICE_CONTROL_PAUSE:
        testServiceStatus.dwCurrentState = SERVICE_PAUSED;
        break;  
    case SERVICE_CONTROL_CONTINUE:  
        testServiceStatus.dwCurrentState = SERVICE_RUNNING;
        break;  
    case SERVICE_CONTROL_INTERROGATE: 
        MessageBeep(MB_OK);
        break;  
    case SERVICE_CONTROL_SHUTDOWN:  
        break;  
    default:  
        SvcDebugOut("[TESTSRV_SERVICE] Unrecognized opcode %ld\n",opcode);
    }
    if(!SetServiceStatus(testServiceStatusHandle,&testServiceStatus))
    {
        SvcDebugOut("[TESTSRV_SERVICE]SetServiceStatus error %ld\n",status);
    }
    return;
}

BOOL IsInstalled()
{
    BOOL bResult = FALSE;

    //打开服务控制管理器
    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

    if (hSCM != NULL)
    {
        //打开服务
        SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_QUERY_CONFIG);
        if (hService != NULL)
        {
            bResult = TRUE;
            ::CloseServiceHandle(hService);
        }
        ::CloseServiceHandle(hSCM);
    }
    return bResult;
}

BOOL Install()
{
    if (IsInstalled())
        return TRUE;

    //打开服务控制管理器
    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (hSCM == NULL)
    {
        MessageBox(NULL, _T("Couldn't open service manager"), szServiceName, MB_OK);
        return FALSE;
    }

    // Get the executable file path
    TCHAR szFilePath[MAX_PATH];
    ::GetModuleFileName(NULL, szFilePath, MAX_PATH);

    //创建服务
    SC_HANDLE hService = ::CreateService(
        hSCM, szServiceName, szServiceName,
        SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
        SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
        szFilePath, NULL, NULL, _T(""), NULL, NULL);

    if (hService == NULL)
    {
        ::CloseServiceHandle(hSCM);
        MessageBox(NULL, _T("Couldn't create service"), szServiceName, MB_OK);
        return FALSE;
    }

    ::CloseServiceHandle(hService);
    ::CloseServiceHandle(hSCM);
    return TRUE;
}

void SvcDebugOut(LPSTR String,DWORD Status)
{
    char Buffer[1024];
    if(strlen(String) < 1000)
    {
        wsprintf(Buffer,String,Status);
        OutputDebugString(Buffer);
    }
}