NTSERVER中调用SHELLAPI大多会失败,请问是怎么回事?
请大家探讨!!!

解决方案 »

  1.   

    比如你在服务线程中SHOWWINDOW。
      

  2.   

    你是指在service中showwindow吗?那需要取得当前的workstation和desktop后才可以用。
    可以参考msdn,这里还有一段别人的程序:
    unit ServiceDesktop;interfacefunction InitServiceDesktop: boolean;
    procedure DoneServiceDeskTop;{$INCLUDE Config.inc}implementationuses
      Windows, SysUtils, Common;const
      DefaultWindowStation = 'WinSta0';
      DefaultDesktop       = 'Default';
    var
      hwinstaSave: HWINSTA;
      hdeskSave: HDESK;
      hwinstaUser: HWINSTA;
      hdeskUser: HDESK;function InitServiceDesktop: boolean;
    var
      dwThreadId: DWORD;
    begin
      {$IFDEF DEBUG}CreateLog('InitServiceDesktop');{$ENDIF}
      dwThreadId := GetCurrentThreadID;
      // Ensure connection to service window station and desktop, and
      // save their handles.
      hwinstaSave := GetProcessWindowStation;
      hdeskSave   := GetThreadDesktop(dwThreadId);
      hwinstaUser := OpenWindowStation(DefaultWindowStation, FALSE, MAXIMUM_ALLOWED);
      if hwinstaUser = 0 then
      begin
        {$IFDEF DEBUG}CreateLog('OpenWindowStation failed' +  SysErrorMessage(GetLastError)){$ENDIF};
        Result := false;
        exit;
      end;  if not SetProcessWindowStation(hwinstaUser)  then
      begin
        {$IFDEF DEBUG}CreateLog('SetProcessWindowStation failed'){$ENDIF};
        Result := false;
        exit;
      end;  hdeskUser := OpenDesktop(DefaultDesktop, 0, FALSE, MAXIMUM_ALLOWED);
      if hdeskUser = 0 then
      begin
        {$IFDEF DEBUG}CreateLog('OpenDesktop failed'){$ENDIF};
        SetProcessWindowStation(hwinstaSave);
        CloseWindowStation(hwinstaUser);
        Result := false;
        exit;
      end;
      Result := SetThreadDesktop(hdeskUser);
      if not Result then
        {$IFDEF DEBUG}CreateLog('SetThreadDesktop' + SysErrorMessage(GetLastError)){$ENDIF};
    end;procedure DoneServiceDeskTop;
    begin
      {$IFDEF DEBUG}CreateLog('DoneServiceDesktop');{$ENDIF}
      // Restore window station and desktop.
      SetThreadDesktop(hdeskSave);
      SetProcessWindowStation(hwinstaSave);
      if hwinstaUser <> 0 then
        CloseWindowStation(hwinstaUser);
      if hdeskUser <> 0 then
        CloseDesktop(hdeskUser);
    end;initialization
      InitServiceDesktop;finalization
      DoneServiceDesktop;
    end.
      

  3.   

    to:tonylk(tony)
    谢谢,不过你知道如何在NTSERVICE中创建进程,但同时不让创建的进程继承NTSERVICE的安全属性,比如可以在任务管理器中关闭创建的进程。
      

  4.   

    用createprocess可以定义创建的进程用什么用户的身份来运行的,具体参数忘了,但是必须知道这个有效用户的用户名和密码,当然如果用户激活了guest帐号,那么就可以用这个。
      

  5.   

    to:tonylk(tony)
    帮忙找一找,我急需!!先谢了!:)