RegForm.pas
上传用户:yuandong
上传日期:2022-08-08
资源大小:954k
文件大小:13k
源码类别:

Delphi控件源码

开发平台:

C++ Builder

  1. unit RegForm;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   Buttons, StdCtrls, FileCtrl, ComCtrls, WinSvc, Grids, Outline, DirOutln;
  6. type
  7.   TPPInstallForm = class(TForm)
  8.     btnInsert: TButton;
  9.     btnCleanUp: TButton;
  10.     BitBtn1: TBitBtn;
  11.     DirectoryListBox1: TDirectoryListBox;
  12.     DriveComboBox1: TDriveComboBox;
  13.     btnLocateDLL: TButton;
  14.     m_OpenDLLDialog: TOpenDialog;
  15.     Button1: TButton;
  16.     GroupBox1: TGroupBox;
  17.     l_strDLLPath: TLabel;
  18.     Label2: TLabel;
  19.     Label3: TLabel;
  20.     GroupBox2: TGroupBox;
  21.     Label1: TLabel;
  22.     l_strTempPath: TLabel;
  23.     Button2: TButton;
  24.     procedure BitBtn1Click(Sender: TObject);
  25.     procedure btnInsertClick(Sender: TObject);
  26.     procedure btnCleanUpClick(Sender: TObject);
  27.     procedure FormCreate(Sender: TObject);
  28.     procedure DriveComboBox1Change(Sender: TObject);
  29.     procedure DirectoryListBox1Click(Sender: TObject);
  30.     procedure DirectoryListBox1Change(Sender: TObject);
  31.     procedure btnLocateDLLClick(Sender: TObject);
  32.     procedure Button1Click(Sender: TObject);
  33.     procedure Button2Click(Sender: TObject);
  34.   private
  35.     { Private declarations }
  36.   public
  37.     { Public declarations }
  38.     m_strDLLSrcDir : string;
  39.     m_strTempVar : string;
  40.     m_bSrcFound : boolean;
  41.     lpszTempDir : PChar;
  42.     strTempDir : string;
  43.   end;
  44. var
  45.   PPInstallForm: TPPInstallForm;
  46. implementation
  47. Uses
  48.   WinReg;
  49. {$R *.DFM}
  50. // define a constant to hold our registry key
  51. const
  52.   PMON_KEY = 'SYSTEMCurrentControlSetControlPrintEnvironmentsWindows NT x86Print Processors';
  53.   TEMP_KEY = 'SYSTEMCurrentControlSetControlSession Manager';
  54. procedure TPPInstallForm.BitBtn1Click(Sender: TObject);
  55. begin
  56.   Close;
  57. end;
  58. //
  59. // start and stop software routines
  60. // taken from http://www.chami.com/tips/delphi/040698D.html
  61. //
  62. // start service
  63. //
  64. // return TRUE if successful
  65. //
  66. // sMachine:
  67. //   machine name, ie: \SERVER
  68. //   empty = local machine
  69. //
  70. // sService
  71. //   service name, ie: spooler
  72. //
  73. function ServiceStart(sMachine, sService : string ) : boolean;
  74.   var
  75.     schm, schs : SC_Handle;  // service control manager handle & service handle
  76.     ss : TServiceStatus;  // service status
  77.     psTemp : PChar; // temp char pointer
  78.     dwChkP : DWord;   // check point
  79.   begin
  80.     ss.dwCurrentState := 0;
  81.     // connect to the service control manager
  82.     schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_CONNECT);
  83.     // if successful...
  84.     if(schm > 0)then begin
  85.       // open a handle to the specified service
  86.       // we want to start the service and query service status
  87.       schs := OpenService(schm, PChar(sService), SERVICE_START or SERVICE_QUERY_STATUS);
  88.       // if successful...
  89.       if(schs > 0)then begin
  90.         psTemp := Nil;
  91.         if(StartService(schs, 0, psTemp)) then begin
  92.           // check status
  93.           if (QueryServiceStatus(schs, ss))then begin
  94.             while (SERVICE_RUNNING <> ss.dwCurrentState)do begin
  95.               //
  96.               // dwCheckPoint contains a value that the service increments periodically
  97.               // to report its progress during a lengthy operation.
  98.               // save current value
  99.               dwChkP := ss.dwCheckPoint;
  100.               // wait a bit before checking status again
  101.               //
  102.               // dwWaitHint is the estimated amount of time
  103.               // the calling program should wait before calling
  104.               // QueryServiceStatus() again
  105.               //
  106.               // idle events should be
  107.               // handled here...
  108.               //
  109.               Sleep(ss.dwWaitHint);
  110.               if (not QueryServiceStatus(schs, ss))then begin
  111.                 // couldn't check status
  112.                 // break from the loop
  113.                 break;
  114.               end;
  115.               if (ss.dwCheckPoint < dwChkP) then begin
  116.                 // QueryServiceStatus didn't increment dwCheckPoint as it should have.
  117.                 // avoid an infinite loop by breaking
  118.                 break;
  119.               end;
  120.             end;
  121.           end;
  122.         end;
  123.         // close service handle
  124.         CloseServiceHandle(schs);
  125.       end;
  126.       // close service control manager handle
  127.       CloseServiceHandle(schm);
  128.   end;
  129.   // return TRUE if the service status is running
  130.   Result := SERVICE_RUNNING = ss.dwCurrentState;
  131. end;
  132. //
  133. // stop service
  134. //
  135. // return TRUE if successful
  136. //
  137. // sMachine:
  138. //   machine name, ie: \SERVER
  139. //   empty = local machine
  140. //
  141. // sService
  142. //   service name, ie: Alerter
  143. //
  144. function ServiceStop(sMachine, sService : string ) : boolean;
  145.   var
  146.     schm, schs   : SC_Handle; // service control & service handle manager handle
  147.     ss : TServiceStatus; // service status
  148.     dwChkP : DWord; // check point
  149.   begin
  150.     // connect to the service control manager
  151.     schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_CONNECT);
  152.     // if successful...
  153.     if (schm > 0) then begin
  154.       // open a handle to the specified service
  155.       // we want to stop the service and query service status
  156.       schs := OpenService(schm, PChar(sService), SERVICE_STOP or SERVICE_QUERY_STATUS);
  157.       // if successful...
  158.       if (schs > 0) then begin
  159.         if (ControlService(schs, SERVICE_CONTROL_STOP, ss)) then begin
  160.           // check status
  161.           if (QueryServiceStatus(schs, ss)) then begin
  162.             while (SERVICE_STOPPED <> ss.dwCurrentState) do begin
  163.               // dwCheckPoint contains a value that the service increments periodically
  164.               // to report its progress during a lengthy operation.
  165.               //
  166.               // save current value
  167.               //
  168.               dwChkP := ss.dwCheckPoint;
  169.               //
  170.               // wait a bit before checking status again
  171.               //
  172.               // dwWaitHint is the estimated amount of time
  173.               // the calling program should wait before calling QueryServiceStatus() again
  174.               //
  175.               // idle events should be handled here...
  176.               //
  177.               Sleep(ss.dwWaitHint);
  178.               if (not QueryServiceStatus(schs, ss)) then begin
  179.                 // couldn't check status
  180.                 // break from the loop
  181.                 break;
  182.               end;
  183.               if (ss.dwCheckPoint < dwChkP) then begin
  184.                 // QueryServiceStatus didn't increment dwCheckPoint as it should have.
  185.                 // avoid an infinite loop by breaking
  186.                 break;
  187.               end;
  188.             end;
  189.           end;
  190.         end;
  191.         // close service handle
  192.         CloseServiceHandle(schs);
  193.       end;
  194.       // close service control  manager handle
  195.       CloseServiceHandle(schm);
  196.     end;
  197.     // return TRUE if  the service status is stopped
  198.     Result := SERVICE_STOPPED = ss.dwCurrentState;
  199.   end;
  200. function GetWinDir : string;
  201. var
  202.   lpszDir : PChar;
  203.   strTmp : string;
  204. begin
  205.   GetMem(lpszDir, 255);
  206.   GetEnvironmentVariable('windir', lpszDir, 255);
  207.   strTmp := string(lpszDir);
  208.   FreeMem(lpszDir);
  209.   GetWinDir := strTmp;
  210. end;
  211. procedure TPPInstallForm.btnInsertClick(Sender: TObject);
  212. var
  213.   reg : TWinRegistry;
  214.   DLLString, VerString, DestDirString : string;
  215.   strWinDir : string;
  216. begin
  217.   if MessageDlg('Really install?', mtConfirmation, mbOKCancel, 0) = mrOk then begin
  218.     // open the registry using the default root of HKEY_CURRENT_USER
  219.     reg := TWinRegistry.CreateWithKey(HKEY_LOCAL_MACHINE, PMON_KEY);
  220.     // initialise the variables
  221.     DLLString := 'vprproc.dll';
  222.     VerString := '1.0';
  223.     DestDirString := l_strTempPath.Caption;
  224.     // write the variables to the registry
  225.     with reg do begin
  226.       WriteString('vprproc', 'Driver', DLLString);
  227.       WriteString('vprproc', 'Version', VerString);
  228.       WriteString('vprproc', 'DestDir', DestDirString);
  229.     end;
  230.     reg.Free;
  231.     ShowMessage('Registry Keys installed.');
  232.     // copy dll into dest directory if dll is specified
  233.     if (FileExists(m_strDLLSrcDir) = True) and (m_strDLLSrcDir <> '') then begin
  234.       strWinDir := GetWinDir;
  235.       if (strWinDir[Length(strWinDir)] <> '') then strWinDir := Concat(strWinDir, '');
  236.       strWinDir := Concat(strWinDir, 'system32spoolprtprocsw32x86vprproc.dll');
  237.       ShowMessage('Now stopping spooler service.');
  238.       if (ServiceStop('', 'spooler')) then begin
  239.         ShowMessage('Copying '+ m_strDLLSrcDir+ ' to ' + strWinDir + ' .');
  240.         CopyFile(PChar(m_strDLLSrcDir), PChar(strWinDir), False);
  241.         ShowMessage('Now starting spooler service.');
  242.         if not ServiceStart('', 'spooler') then
  243.           ShowMessage('Could not start spooler service.' + #13 + 'Please uninstall driver and try again.')
  244.         else
  245.           ShowMessage('Printer Processor installed.');
  246.       end else
  247.         ShowMessage('Could not stop spooler service. ' + #13 + 'Please start spooler service manually and try again.');
  248.     end;
  249.   end;
  250. end;
  251. procedure TPPInstallForm.btnCleanUpClick(Sender: TObject);
  252. var
  253.   reg : TWinRegistry;
  254.   strWinDir : string;
  255. begin
  256.   if MessageDlg('Really uninstall?', mtConfirmation, mbOKCancel, 0) = mrOk then begin
  257.     ShowMessage('Stopping spooler service.');
  258.     if (ServiceStop('', 'spooler')) then begin
  259.       reg := TWinRegistry.CreateWithKey(HKEY_LOCAL_MACHINE, PMON_KEY);
  260.       reg.EraseSection('vprproc');
  261.       reg.Free;
  262.     end;
  263.     if MessageDlg('Registry keys for VPrinter deleted. Delete vprproc.dll?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin
  264.       strWinDir := GetWinDir;
  265.       if (strWinDir[Length(strWinDir)] <> '') then strWinDir := Concat(strWinDir, '');
  266.       strWinDir := Concat(strWinDir, 'system32spoolprtprocsw32x86vprproc.dll');
  267.       DeleteFile(strWinDir);
  268.     end;
  269.     ShowMessage('All actions done. Now restarting spooler service.');
  270.     ServiceStart('', 'spooler' );
  271.     ShowMessage('Spooler service restarted.');
  272.   end;
  273. end;
  274. procedure TPPInstallForm.FormCreate(Sender: TObject);
  275. var reg : TWinRegistry;
  276. begin
  277.   m_strDLLSrcDir := '';
  278.   m_bSrcFound := False;
  279.   // look if environment is defined
  280.   reg := TWinRegistry.CreateWithKey(HKEY_LOCAL_MACHINE, PMON_KEY);
  281.   m_strTempVar := reg.ReadString('vprproc', 'DestDir', '');
  282.   if (m_strTempVar = '') then begin
  283.     ShowMessage('vprproc registry settings not yet set!' + #13 + 'Please select destination directory for print jobs.');
  284.     btnInsert.Enabled := False;
  285.   end else if not(DirectoryExists(m_strTempVar)) then begin
  286.     ShowMessage('Inappropriate Registry Settings. Please reinstall!');
  287.     l_strTempPath.Caption := m_strTempVar;
  288.   end else
  289.     l_strTempPath.Caption := m_strTempVar;
  290.   reg.Free;
  291.   if l_strTempPath.Caption<>'' then
  292.     if DirectoryExists(l_strTempPath.Caption) then begin
  293.      {$I-}
  294.      DriveComboBox1.Drive := (ExpandFileName(l_strTempPath.Caption))[1];
  295.      DirectoryListBox1.Directory := l_strTempPath.Caption;
  296.      if IOResult <> 0 then MessageDlg('No temp directory specified.', mtError, [mbOk], 0);
  297.      {$I+}
  298.     end;
  299. end;
  300. procedure TPPInstallForm.DriveComboBox1Change(Sender: TObject);
  301. begin
  302.   DirectoryListBox1.Directory := DriveComboBox1.Drive
  303. end;
  304. procedure TPPInstallForm.DirectoryListBox1Click(Sender: TObject);
  305. begin
  306.   l_strTempPath.Caption := DirectoryListBox1.Directory;
  307. end;
  308. procedure TPPInstallForm.DirectoryListBox1Change(Sender: TObject);
  309. begin
  310.   l_strTempPath.Caption := DirectoryListBox1.Directory;
  311.   btnInsert.Enabled := True;
  312. end;
  313. procedure TPPInstallForm.btnLocateDLLClick(Sender: TObject);
  314. begin
  315.   ShowMessage('Choose the appropriate DLL: select vproc.dll' + #13 +
  316.               'from the w2k directory if you use Windows 2000 or vprproc.dll' + #13 +
  317.               'from the xp directory if you use Windows XP.');
  318.   if m_OpenDLLDialog.Execute then begin
  319.     m_strDLLSrcDir := m_OpenDLLDialog.FileName;
  320.     l_strDLLPath.Caption := m_OpenDLLDialog.FileName;
  321.     m_bSrcFound := True;
  322.   end else begin
  323.     l_strDLLPath.Caption := '<empty>';
  324.     m_strDLLSrcDir := '';
  325.     m_bSrcFound := False;
  326.   end;
  327. end;
  328. procedure TPPInstallForm.Button1Click(Sender: TObject);
  329. begin
  330.   ShowMessage('To reinstall print processor dll, locate vprproc.dll by pressing ''Locate DLL'' button.' + #13 +
  331.               'Choose the appropriate dll for Windows 2000 or XP.' + #13 +
  332.               'If you don''t want to reinstall, leave Locate field <empty>' + #13 +
  333.               'To install dll (if specified) and registry keys, press ''Install'' button' + #13 +
  334.               'To uninstall registry keys and to delete vprproc.dll, press ''Uninstall'' button.');
  335. end;
  336. procedure TPPInstallForm.Button2Click(Sender: TObject);
  337. begin
  338.   MessageDlg('Print Processor Installer Tool' + #13 + '(C) 2002 mabuse.de', mtInformation, [mbOK], 0);
  339. end;
  340. end.