wuhuaqiang:very useful !
(发表于2004-4-15 12:59:00)
龙仪:好,非常好!!!希望能多拿点经典的出来:)
(发表于2004-4-15 19:20:00)
YuHao:很多文章说到要在NT服务程序中显示界面,必须要OpenWindowStation(_T("winsta0")...),但本人没有这样做,这是一个疑问。
>>你程序里不是用了SERVICE_INTERACTIVE_PROCESS参数吗?难道用了还不知道它是做什么的?
(发表于2004-4-15 23:06:00)
周星星:to YuHao:
标志SERVICE_INTERACTIVE_PROCESS是必须加的,否则即使使用了OpenWindowStation也不能出现交互界面。
(发表于2004-4-16 8:28:00)
周星星:to All:在ServiceStop函数中我直接根据对话框句柄调用EndDialog去关闭对话框这是一个不好的做法。因为服务退出所在线程与对话框所在线程不是同一个线程,如果对话框中含有不能跨线程使用的对象,这将是一个麻烦,所以我觉得还是使用消息去通知对话框关闭比较好。
(发表于2004-4-16 8:35:00)
YuHao:你真的试过吗?我把你的程序改了一下,结果还是能出来。
把SERVICE_INTERACTIVE_PROCESS去掉;启动函数如下
VOID ServiceStart (DWORD dwArgc, LPTSTR *lpszArgv)
{
ReportStatusToSCMgr( SERVICE_RUNNING, NO_ERROR, 0 );
HDESK hdeskCurrent;
HDESK hdesk;
HWINSTA hwinstaCurrent;
HWINSTA hwinsta;
hwinstaCurrent = GetProcessWindowStation();
hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
hwinsta = OpenWindowStation("winsta0", FALSE,
WINSTA_ACCESSCLIPBOARD |
WINSTA_ACCESSGLOBALATOMS |
WINSTA_CREATEDESKTOP |
WINSTA_ENUMDESKTOPS |
WINSTA_ENUMERATE |
WINSTA_EXITWINDOWS |
WINSTA_READATTRIBUTES |
WINSTA_READSCREEN |
WINSTA_WRITEATTRIBUTES);
(发表于2004-4-16 13:16:00)
YuHao:SetProcessWindowStation(hwinsta); hdesk = OpenDesktop("default", 0, FALSE,
DESKTOP_CREATEMENU |
DESKTOP_CREATEWINDOW |
DESKTOP_ENUMERATE |
DESKTOP_HOOKCONTROL |
DESKTOP_JOURNALPLAYBACK |
DESKTOP_JOURNALRECORD |
DESKTOP_READOBJECTS |
DESKTOP_SWITCHDESKTOP |
DESKTOP_WRITEOBJECTS);
SetThreadDesktop(hdesk);
CT01Dlg dlg;
// theApp.m_pMainWnd = &dlg;
dlg.DoModal();
SetProcessWindowStation(hwinstaCurrent));
SetThreadDesktop(hdeskCurrent);
CloseWindowStation(hwinsta);
CloseDesktop(hdesk);
}
(发表于2004-4-16 13:16:00)
周星星:to YuHao:非常感谢,确实是可以的,可能是我当时测试时不小心,再次深表感谢!
(发表于2004-4-16 13:53:00)
oshj:才看到,顶 :-)
(发表于2004-4-19 8:29:00)
oakdream:VOID CmdStopService( )
{
SC_HANDLE schService;
SC_HANDLE schSCManager;
TCHAR szPath[512];
if ( GetModuleFileName( NULL, szPath, 512 ) == 0 ){
_tprintf(TEXT("Unable to install %s - %s\n"), TEXT(SZSERVICEDISPLAYNAME), GetLastErrorText(szErr, 256));
return;
}
schSCManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (schSCManager!=NULL){
(发表于2004-4-22 15:44:00)
oakdream:schService=OpenService(schSCManager,TEXT(SZSERVICENAME),SERVICE_STOP|SERVICE_QUERY_STATUS);
(发表于2004-4-22 15:48:00)
oakdream:if (schService!=NULL)
{
QueryServiceStatus(schService,&ssStatus);
if (ssStatus.dwCurrentState==SERVICE_RUNNING)
// try to stop the service
if ( ControlService( schService, SERVICE_CONTROL_STOP, &ssStatus ) )
{
_tprintf(TEXT("Stopping %s."), TEXT(SZSERVICEDISPLAYNAME));
Sleep( 1000 );
(发表于2004-4-22 21:10:00)
kuibobo:为什么我在在调用StartServiceCtrlDispatcher这个函数的时候老是出错!
0x00000427 服务进程无法连接到服务控制器上。
其他自己写的服务程序也是在这个函数那里出错
(发表于2004-6-17 0:09:00)
StevieWang:请问:在BOOL CT01App::InitInstance()中有一个
main( __argc, __argv );
那么__argc和__argv 从何而来?
(发表于2005-5-12 12:36:00)
xiaomaoda:为什么我在我的2000系统的机子上运行后,什么反映都没有啊?包括没有它的系统托盘.运行后,我打开进程管理器,
先开始有它的进程,可是过几秒后就没了.请讲解怎么运行,关于上面的我看不懂
(发表于2005-9-15 10:24:00)
xiaomaoda:为什么我在我的2000系统的机子上运行后,什么反映都没有啊?
我本来想应该有个窗口让我输入一些命令的,可是什么都没有,没有任何界面,进程先开始有,过几秒后也没有了,三无产品(无主界面,无托盘,无进程)--真厉害
(发表于2005-9-15 10:53:00)
zweii:我在vc7.1下试过了,好像有问题:停止服务的时候报错,搞不懂了。
(发表于2005-9-26 20:20:00)
周星星:re zweii: 只处理的VC6的MFC:
BOOL CALLBACK EnumProc( HWND hWnd, LPARAM lParam)
{
static const TCHAR szAfxOldWndProc[] = _T("AfxOldWndProc423"); // Visual C++ 6.0
//check for property and unsubclass if necessary
WNDPROC oldWndProc = (WNDPROC)::GetProp(hWnd, szAfxOldWndProc);
if (oldWndProc!=NULL)
{
SetWindowLong(hWnd, GWL_WNDPROC, (DWORD)oldWndProc);
RemoveProp(hWnd, szAfxOldWndProc);
}
return TRUE;
}
(发表于2006-7-7 9:40:00)
周星星:使用如下代码获得两个可能的原子
for( ATOM nAtom=MAXINTATOM; nAtom!=0; ++nAtom )
{
char buf[260];
if( GlobalGetAtomName(nAtom,buf,260) )
cout << buf << endl;
}
分别是AfxOldWndProc和AfxOldWndProc423,使用VC7和VC8的话,可以把EnumProc函数中的AfxOldWndProc423换成AfxOldWndProc试试看。
(发表于2006-7-7 10:30:00)
wangwolue:To all:
现在还没有发现可以在window server 2003 中能够用的基于MFC对话框的NT服务程序框架 。
(发表于2006-8-22 16:13:00)
qing3962:我也碰到 zweii 所遇到的问题:在 vc7.1 下编译,启动服务,然后退出,会报错,根据 Dump 信息,这个错误和 WinMain 有关,而不是和"EnumProc"函数有关,不知道怎么解决?(为了能在 vc7.1 下编译通过,我去掉了代码中 main() 函数的前缀 -- _CRTAPI1,并且也尝试过用其它关键字修饰 main,还是会在退出时报错。)
(发表于2007-3-7 10:02:00)
yangzhi070:VC++ 6.0下无错误、警告的通过编译
服务的安装和删除都完成的很好。
非常感谢!!
(发表于2007-3-18 22:22:00)
cqjkwqj:请问一下,我用VC 2005编译后,一切正常,就是在注销后登录,就再也关不了机了,也注销不了了,是怎么回事儿呢?程序是能正常获得焦点的,就是无法关机注销
(发表于2007-8-27 10:25:00)
..........................................................................
--------------------next---------------------