在Delphi开发的服务中调用指定应用程序

简介:
在很多时候,我们需要使用 服务启动指定的应用程 序来做到隐蔽启动程序的目的。
但是当我们直接使用Winexec来运行的时候,你会发现系统提示出错。以下的代码就是如何在 Delphi编写的服务中启动指定的应用程序 。 
function  RunProcess (const ProcessName: String): Boolean;
Var
  siStartupInfo:STARTUPINFO;
  saProcess,saThread:SECURITY_ATTRIBUTES;
  piProcInfo:PROCESS_INFORMATION;
  Hd:Cardinal;
  ProcessHd:THandle;
  Hds:THandle;
  Str:String;
begin
  Result:=False;
  if not ExistFileName(ProcessName) then
  begin
    Exit;
  end;
  ProcessHd:=GetProcessHandleAsName( 'Explorer ');
  if ProcessHd = 0 then Exit;
  if OpenProcessToken(ProcessHd,TOKEN_ALL_ACCESS,Hds)   then
  begin
    if DuplicateTokenEx(Hds,TOKEN_ALL_ACCESS,nil,SecurityIdentification,TokenPrimary,Hd)   then
    begin
      ZeroMemory(@siStartupInfo,sizeof(siStartupInfo));
      siStartupInfo.cb:=sizeof(siStartupInfo);
      saProcess.nLength:=sizeof(saProcess);
      saProcess.lpSecurityDescriptor:=nil;
      saProcess.bInheritHandle:=false;
      saThread.nLength:=sizeof(saThread);
      saThread.lpSecurityDescriptor:=nil;
      saThread.bInheritHandle:=false;
      Result:= CreateProcessAsUser (Hd,nil,PChar(ProcessName),nil,nil,false, CREATE_DEFAULT_ERROR_MODE,nil,nil,siStartupInfo,piProcInfo);
    end;
  end;
end;
 
参数:ProcessName是你需要启动的应用程序的绝对路径。
一般希望启动的时候被启动的应用程序没有运行。这时你就需要首先轮询判断此应用程序是否正在运行,以下代码就是判断你指定的应用程序是否在运行中。 
function  IsExeRun (const ExeName: String): Boolean;
var
  ok: Bool;
  ProcessID: Integer;
  ProcessFullPath: String;
  pProcess: PProcessInfo;
  ProcessListHandle: THandle;
  ProcessStruct: TProcessEntry32;
begin
  //检测用户端是否正在运行
  ProcessListHandle := CreateToolHelp32Snapshot (TH32CS_SNAPPROCESS, 0);
  ProcessStruct.dwSize := Sizeof(ProcessStruct);
  ok := Process32First(ProcessListHandle, ProcessStruct);
  while Integer(ok) <> 0 do
  begin
    ProcessID:=ProcessStruct.th32ProcessID;
        if UpperCase(Trim(ProcessStruct.szExeFile)) = UpperCase(Trim(ExeName)) then
    begin
      Result:=True;
      Exit;
    end;
    ok := Process32Next(ProcessListHandle, ProcessStruct);
  end;
end;
 
其中参数 const ExeName: String 是你需要判断的应用程序在任务管理器中的名称。
如果你希望了解更多信息,欢迎登录“ 掰掰开发”论坛
本文转自狗窝博客51CTO博客,原文链接http://blog.51cto.com/fxh7622/529033如需转载请自行联系原作者

fxh7622
相关文章
|
开发框架 前端开发 JavaScript
跨平台开发:构建一次运行到处工作的应用程序的未来
在当今多样化的设备和操作系统中,跨平台开发已经成为现代应用程序开发的关键。它允许开发人员使用一套代码构建应用程序,然后在多个平台上运行,从而节省时间和资源。本博客将深入研究跨平台开发的核心概念、技术工具以及为什么它们在应用开发中如此重要。
247 0
|
JSON 程序员 数据格式
【平台开发】技术整合思考(三)——将工具程序封装成界面
【平台开发】技术整合思考(三)——将工具程序封装成界面
102 0
|
编译器 C语言 C++
QT 应用编程: 应用程序动态发布
QT 应用编程: 应用程序动态发布
188 0
QT 应用编程: 应用程序动态发布
|
机器学习/深度学习 前端开发 API
WinFrom 只能运行一个实例总结
WinFrom 只能运行一个实例总结
117 0
|
安全 Docker Windows
5个要点,告诉您为何要将旧版 Windows 应用程序进行现代化改造
在短短一年多的时间里,Microsoft 对 Windows Server 2008 的支持即将结束。如果没有做出适当的规划,连锁反应可能会影响您的业务。维护成本将急剧上升,而安全性和合规性风险将在没有定期补丁的情况下增加。
2586 0
下一篇
无影云桌面