C++写的服务中的dll的有关问题,跪求大神
C++写的服务中的dll的问题,跪求大神
写的服务中要调用一个DLL,然后这个DLL里又要调用另一个DLL,我测试了下,第一个DLL能加载也有功能,但是DLL里面的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); } }