示例#1
0
CString GetCurrentDir(void)
{
 CString result; result.SetLength(MAX_PATH_LENGTH);
 if (0!=getcwd(result.GetCString(),MAX_PATH_LENGTH))
 {
  result.SetLength();
  return result;
 }
 return "";
}
示例#2
0
CString RemoveTrailingPathDelimiter(const CString& FilePathName)
{
 CString result = FilePathName;
 if (!FilePathName.IsEmpty())
 {
  if ((FilePathName.GetLastChar()=='/')||(FilePathName.GetLastChar()=='\\'))
  {
   result.SetLength(result.GetLength()-1);
  }
 }
 return result;
}
示例#3
0
bool CNTService::Install(void) {

    SC_HANDLE   ServiceHandle;
    SC_HANDLE   ServiceManager;

    CString ModuleFilename;
    DWORD dwLen = MAX_PATH;
    ModuleFilename.SetLength(dwLen);    
    if (!(dwLen = GetModuleFileNameA(GetModuleHandle(NULL),
        (char *) ModuleFilename.GetBuffer(), 
        dwLen))) {
        cout << "Error getting module path." << endl;
        CObject::ShowLastError();
        return false;
    } else {
        ModuleFilename.SetLength(dwLen);
    }    

    cout << "Attempting to install " << m_ServiceName << " (" << ModuleFilename << ") ..." << endl;
    
    ServiceManager = OpenSCManagerA(
        NULL,                   // machine (NULL == local)
        NULL,                   // database (NULL == default)
        SC_MANAGER_ALL_ACCESS   // access required
        );

    if ( !ServiceManager ) {
        cout << "OpenSCManager failed." << endl;
        CObject::ShowLastError();
        return false;
    }


    CString ServiceDependencies;
    for (register int i=0; i < (int) m_Dependencies.GetSize(); i++) {
        ServiceDependencies += m_Dependencies[i];
        ServiceDependencies += (char) 0;
    }
    ServiceDependencies += (char) 0;
        
    ModuleFilename += " service dispatch";
	ModuleFilename += (" --servicename=" + m_ServiceName);
	ModuleFilename += (" --servicedisplayname=" + m_ServiceDisplayName);

    ServiceHandle = CreateServiceA(
        ServiceManager,                         // SCManager database
        m_ServiceName.GetBuffer(),              // name of service
        m_ServiceDisplayName.GetBuffer(),       // name to display
        SERVICE_ALL_ACCESS,                     // desired access
        SERVICE_WIN32_OWN_PROCESS,              // service type
        SERVICE_AUTO_START,                     // start type
        SERVICE_ERROR_NORMAL,                   // error control type
        ModuleFilename.GetBuffer(),             // service's binary
        NULL,                                   // no load ordering group
        NULL,                                   // no tag identifier
        ServiceDependencies.GetBuffer(),        // dependencies
        m_RunasUsername.GetLength() ? m_RunasUsername.GetBuffer() : NULL,  // account
        m_RunasPassword.GetLength() ? m_RunasPassword.GetBuffer() : NULL); // password

	/* not supported on NT4
	// set service description if any
	DWORD dwSystemVersion = GetVersion();

	if (ServiceHandle && 
		m_ServiceDescription.GetLength() && 
		(dwSystemVersion  < 0x80000000) && // Windows 2000, XP, NT
		(LOBYTE(LOWORD(dwSystemVersion)) >= 5) // Windows 2000, XP
		) {
		SERVICE_DESCRIPTIONA ServiceDescription;
		ServiceDescription.lpDescription = (char *) m_ServiceDescription.GetBuffer();

		if (! ChangeServiceConfig2(ServiceHandle, SERVICE_CONFIG_DESCRIPTION, & ServiceDescription)) {
			cout << "ChangeServiceConfig2 failed." << endl;
			CObject::ShowLastError();
			CloseServiceHandle( ServiceHandle );
			if (ServiceManager) CloseServiceHandle( ServiceManager );
			return false;
		}
	}
	*/

    if (! ServiceHandle) {        
		cout << "CreateService failed." << endl;
        CObject::ShowLastError();
		if (ServiceManager) CloseServiceHandle( ServiceManager );
        return false;
    } else {
		CloseServiceHandle( ServiceHandle );
	}

	if (ServiceManager) {
        CloseServiceHandle( ServiceManager );
	}

    cout << m_ServiceDisplayName << " successfuly installed." << endl;
    return true;
}