在某一个服务程序中,我调用getenv或者GetEnvironmentVariable都不起作用,怎么回事,难道在服务程序中不能取到环境变量么?

解决方案 »

  1.   

    楼上帮我看看,我把我的服务程序全部贴上:
    在main中的那一部分调用环境变量的程序,在启动服务的时候调用就取不到,
    ServiceMain中的getenv同样取不到,声明:环境变量已经配好,且在其他程序中完全可以正常取到。
    这个问题跟msvcrtd.lib、libcd.lib的选择有关系么?还有什么原因会导致环境变量取不到呢?
     #include "stdafx.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <Windows.h>
    #include "public.h"
    #include "toolapi.h"
    #include "Winsvc.h"#include "time.h"
    extern int sync_entry();SERVICE_STATUS m_ServiceStatus;SERVICE_STATUS_HANDLE m_ServiceStatusHandle;BOOL bRunning=true;void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);void WINAPI ServiceCtrlHandler(DWORD Opcode);BOOL InstallService();BOOL DeleteService();int main(int argc, char* argv[]){
    FILE *fp;
        int m;
     char kkk[200];

      m = GetEnvironmentVariable( "SUNRISEDIR", kkk, sizeof( kkk ) );
    fp = fopen( "h:\\ddde.txt", "a+");
    fprintf( fp, "sunrisedir:[%s]", kkk );
    fclose( fp );
    if(argc>1)
    {
    if(strcmp(argv[1],"-i")==0)
    { if(InstallService()) printf("\n\nService Installed Sucessfully\n"); else printf("\n\nError Installing Service\n"); } else if(strcmp(argv[1],"-d")==0) { if(DeleteService()) printf("\n\nService UnInstalled Sucessfully\n"); else printf("\n\nError UnInstalling Service\n"); } else { printf("\n\nUnknown Switch Usage\n\nFor Install use Srv1 -i\n\nFor UnInstall use Srv1 -d\n"); } } else { SERVICE_TABLE_ENTRY DispatchTable[]={{"SYNCSERVER",ServiceMain},{NULL,NULL}};  StartServiceCtrlDispatcher(DispatchTable);  } return 0;}void WINAPI ServiceMain(DWORD argc, LPTSTR *argv){
        int   ret ;
    DWORD status; 
        FILE *fp;
    DWORD specificError;  m_ServiceStatus.dwServiceType = SERVICE_WIN32;  m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;  m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;  m_ServiceStatus.dwWin32ExitCode = 0;  m_ServiceStatus.dwServiceSpecificExitCode = 0;  m_ServiceStatus.dwCheckPoint = 0;  m_ServiceStatus.dwWaitHint = 0; 
    m_ServiceStatusHandle = RegisterServiceCtrlHandler("SYNCSERVER",ServiceCtrlHandler);  if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)  {  return;  }  m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;  m_ServiceStatus.dwCheckPoint = 0;  m_ServiceStatus.dwWaitHint = 0;  if (!SetServiceStatus (m_ServiceStatusHandle, &m_ServiceStatus))  {  } 
    bRunning=true;// while(bRunning)// { 
       fp = fopen( "h:\\dddd.txt", "a+");
    fprintf( fp, "sunrisedir:[%s]", getenv("SUNRISEDIR" ) );
    fclose( fp );
    if ( ( ret = sync_entry( ) )!= E_OK ){
       fp = fopen( "h:\\cccc.txt", "a+");
    fprintf( fp, "%s", "cao pi" );
    fclose( fp );
    printf("bufu2");
    return  ;
    }
    fp = fopen( "h:\\bbbb.txt", "a+");
    fprintf( fp, "%s", "cao" );
    fclose( fp );
    // Sleep(3000);
            //Sleep(3000); //Place Your Code for processing here....// } return; } void WINAPI ServiceCtrlHandler(DWORD Opcode){ switch(Opcode)  {  case SERVICE_CONTROL_PAUSE:  m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;  break; 
    case SERVICE_CONTROL_CONTINUE:  m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;  break; 
    case SERVICE_CONTROL_STOP:  m_ServiceStatus.dwWin32ExitCode = 0;  m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;  m_ServiceStatus.dwCheckPoint = 0;  m_ServiceStatus.dwWaitHint = 0; 
    SetServiceStatus (m_ServiceStatusHandle,&m_ServiceStatus); bRunning=false; break;
    case SERVICE_CONTROL_INTERROGATE:  break;  }  return; }BOOL InstallService(){ char strDir[1024]; HANDLE schSCManager,schService; GetCurrentDirectory(1024,strDir); strcat(strDir,"\\debug\\winservices.exe");  schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); 
    if (schSCManager == NULL)  return false; LPCTSTR lpszBinaryPathName=strDir;
    schService = CreateService(schSCManager,"SYNCSERVER","SYNCSERVER", // service name to display  SERVICE_ALL_ACCESS, // desired access  SERVICE_WIN32_OWN_PROCESS, // service type  SERVICE_DEMAND_START, // start type 
    //SERVICE_AUTO_START, //开机自动启动
    SERVICE_ERROR_NORMAL, // error control type  lpszBinaryPathName, // service's binary  NULL, // no load ordering group  NULL, // no tag identifier  NULL, // no dependencies  NULL, // LocalSystem account  NULL); // no password 
    if (schService == NULL)  return false; 
    CloseServiceHandle(schService);  return true;} BOOL DeleteService(){ HANDLE schSCManager; SC_HANDLE hService; schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
    if (schSCManager == NULL)  return false;  hService=OpenService(schSCManager,"SYNCSERVER",SERVICE_ALL_ACCESS); if (hService == NULL)  return false; if(DeleteService(hService)==0) return false; if(CloseServiceHandle(hService)==0) return false; else return true;}
      

  2.   

    最新进展,我若在get之前手动putenv就可以得到。真是不解