Chinaunix首页 | 论坛 | 博客
  • 博客访问: 367621
  • 博文数量: 715
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:46
文章分类

全部博文(715)

文章存档

2011年(1)

2008年(714)

我的朋友

分类:

2008-10-13 16:40:44

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---------------------

阅读(233) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~