请问我在WindowsNT服务中,如何去调用一个可视化的窗体?我用ShellExecute,WinExec,CreateProcess三个函数调用都没有成功,不知道问什么?

解决方案 »

  1.   

    需要取得当前桌面,才可以显示窗口等,
    将以下单元加入你的工程,并写到uses列表的第一个。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.
      

  2.   

    另外要将你继承自的Service类的Interactive属性设为true。
      

  3.   

    我上次回答的内容怎么不见了??我那段程序里使用dll导出的函数来得到一个tguid类型的值,所以yy是tguid类型的,你要根据你的dll函数是否返回值以及返回什么值自己来处理了。