有关windows的服务程序的一个问题 在某一个服务程序中,我调用getenv或者GetEnvironmentVariable都不起作用,怎么回事,难道在服务程序中不能取到环境变量么? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 楼上帮我看看,我把我的服务程序全部贴上:在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;} 最新进展,我若在get之前手动putenv就可以得到。真是不解 RS232 接收数据 COM组件 VS2005怎么实现断点调试 ratUserPassword ---> ias (Internet验证服务)扩展DLL 如何使在同一个类中定义的CEvent对象可用于该类的静态线程函数? 从界面到代码编辑区和从代码编辑区 到 界面是通过哪个快捷键来切换的,谢谢! 如何在程式運行中動態去掉Edit的邊框? 如何删除一个文件里的内容? TreeCtrl的问题 问题。拜托 刚来的,问一下规矩 请问用什么工具可以得到一个dll文件中的函数和参数(vc) 请问关于system()函数的使用?c++高手请进
在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;}