win32服务启动应用程序 我想在通过写一个服务来,启动应用程序,在服务程序里用ShellExecute(),好像不行,不知道什么原因!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 因为一般服务没有打开桌面交互选项,也就是在system帐号下运行。可以通过服务管理器修改,也可以修改服务的运行权限。 ShellExecute(NULL,"open",achAppPath,NULL,NULL,SW_SHOWNORMAL)这个这样写有问题么?第一个参数我设置为空! 因为你服务启动的UI程序无法在当前桌面显示你可以获得当前用户explorer.exe的token,然后以CreateProcessAsUser模拟当前用户启动你的程序,这样可以显示出来 你服务启动的程序不能在当前桌面显示,可以先得到当前用户explorer.exe的token,然后在服务中用CreateProcessAsUser模拟当前用户启动程序.. 启动服务的时候报XX内存不可读,找了半天还是不清楚,框架是用别人的源码如下// FileProSer.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "windows.h"#include "stdio.h"#define LOGFile "c:\\log.txt"SERVICE_STATUS ServiceStatus; SERVICE_STATUS_HANDLE hStatus;void ServiceMain();void ControlHandler(DWORD request);int InitService();int WriteToLog(char* str){ FILE* log = fopen(LOGFile,"a+"); if(log == NULL) return -1; fprintf(log,"%s\n",str); fclose(log); return 0;}int InitService(){ OutputDebugString("START"); int result; result = WriteToLog("START"); return result;}void ControlHandler(DWORD request){ switch(request) { case SERVICE_CONTROL_STOP: OutputDebugString("STOP"); WriteToLog("....STOP"); ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(hStatus,&ServiceStatus); return; case SERVICE_CONTROL_SHUTDOWN: OutputDebugString("STOP"); WriteToLog("....STOP"); ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(hStatus,&ServiceStatus); return; default: break; } SetServiceStatus(hStatus,&ServiceStatus); return;}void ServiceMain()//int argc,char** argv{ int error; ServiceStatus.dwServiceType = SERVICE_WIN32; ServiceStatus.dwCurrentState = SERVICE_START_PENDING; ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN; ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwServiceSpecificExitCode = 0; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; hStatus = RegisterServiceCtrlHandler("RunFilePro",(LPHANDLER_FUNCTION)ControlHandler); if(hStatus == (SERVICE_STATUS_HANDLE)0) { return ; } error = InitService(); if(error) { ServiceStatus.dwCurrentState = SERVICE_STOPPED; ServiceStatus.dwWin32ExitCode = -1; SetServiceStatus(hStatus,&ServiceStatus); } if(ServiceStatus.dwCurrentState = SERVICE_RUNNING) { char achAppPath[MAX_PATH]={0}; char *pchPath=NULL; GetModuleFileName(NULL,achAppPath,MAX_PATH); pchPath = strrchr(achAppPath, '\\') + 1; if (pchPath != NULL) *pchPath = 0; strcat(achAppPath,"XDict.exe"); ShellExecute(NULL,"open","D:\\工具软件\\金山词霸\\XDict.exe",NULL,NULL,SW_SHOWNORMAL);//achAppPath }}void main(){ SERVICE_TABLE_ENTRY ServiceTable[2]; ServiceTable[0].lpServiceName = "RunFilePro"; ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; ServiceTable[1].lpServiceName = NULL; ServiceTable[1].lpServiceProc = NULL; StartServiceCtrlDispatcher(ServiceTable);} 创建进程??我想通过服务将应用程序启动!!我用的是xp sp2 大体上是解决了,和桌面交互通过安装服务的时候通过CreateService( schSCManager, SVCNAME, SVCNAME, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,//SERVICE_INTERACTIVE_PROCESS设置这样服务属性就将和桌面交互勾上,然//后试下上面说的方法 SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, szPath, NULL, NULL, NULL, NULL, NULL); 请问这个和上面的怎么联系起来?可以给我发个源码吗?谢谢:[email protected] 用什么方法不停的把接受的数据都保存起来,这些数据随着时间的增长不停的增多 SOCKET的句柄能否从支线程回传给主线程?怎么传 请问如何提取网页内链接? 100散分!混个脸熟,来者有分 请问怎么样才能把clistctrl的某一行的字体的颜色改变,不过不用drawitem的方法 我有软件外包,找地点在福州的VC程序员。 几个书名的翻译!!!!!!在线等待!!!!!!! mci当中如何能得到所有MCI设备数量?以及如何指定设备播放?超多分数求解 初次提问:有关MSDN 关于VirtualAlloc 的疑问 win7下sendto(),居然来个没有权限,高人指点! 女兵90天写40W行代码
第一个参数我设置为空!
你可以获得当前用户explorer.exe的token,然后以CreateProcessAsUser模拟当前用户启动你的程序,这样可以显示出来
源码如下// FileProSer.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include "windows.h"
#include "stdio.h"#define LOGFile "c:\\log.txt"SERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE hStatus;void ServiceMain();
void ControlHandler(DWORD request);int InitService();int WriteToLog(char* str)
{
FILE* log = fopen(LOGFile,"a+"); if(log == NULL)
return -1;
fprintf(log,"%s\n",str);
fclose(log);
return 0;}
int InitService()
{
OutputDebugString("START");
int result;
result = WriteToLog("START"); return result;
}void ControlHandler(DWORD request)
{ switch(request)
{
case SERVICE_CONTROL_STOP:
OutputDebugString("STOP");
WriteToLog("....STOP");
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hStatus,&ServiceStatus);
return;
case SERVICE_CONTROL_SHUTDOWN:
OutputDebugString("STOP");
WriteToLog("....STOP"); ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hStatus,&ServiceStatus);
return; default:
break; }
SetServiceStatus(hStatus,&ServiceStatus); return;}void ServiceMain()//int argc,char** argv
{
int error;
ServiceStatus.dwServiceType = SERVICE_WIN32; ServiceStatus.dwCurrentState = SERVICE_START_PENDING; ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN; ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwServiceSpecificExitCode = 0; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; hStatus = RegisterServiceCtrlHandler("RunFilePro",(LPHANDLER_FUNCTION)ControlHandler); if(hStatus == (SERVICE_STATUS_HANDLE)0)
{
return ;
} error = InitService(); if(error)
{
ServiceStatus.dwCurrentState = SERVICE_STOPPED; ServiceStatus.dwWin32ExitCode = -1; SetServiceStatus(hStatus,&ServiceStatus);
}
if(ServiceStatus.dwCurrentState = SERVICE_RUNNING)
{
char achAppPath[MAX_PATH]={0};
char *pchPath=NULL;
GetModuleFileName(NULL,achAppPath,MAX_PATH);
pchPath = strrchr(achAppPath, '\\') + 1;
if (pchPath != NULL)
*pchPath = 0; strcat(achAppPath,"XDict.exe"); ShellExecute(NULL,"open","D:\\工具软件\\金山词霸\\XDict.exe",NULL,NULL,SW_SHOWNORMAL);//achAppPath
}}void main()
{ SERVICE_TABLE_ENTRY ServiceTable[2];
ServiceTable[0].lpServiceName = "RunFilePro";
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; ServiceTable[1].lpServiceName = NULL;
ServiceTable[1].lpServiceProc = NULL; StartServiceCtrlDispatcher(ServiceTable);}
CreateService(
schSCManager,
SVCNAME,
SVCNAME,
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,//SERVICE_INTERACTIVE_PROCESS设置这样服务属性就将和桌面交互勾上,然//后试下上面说的方法
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL,
szPath,
NULL,
NULL,
NULL,
NULL,
NULL);