从windows服务中调用一个外部的窗口程序。
网上搜了半天没有正确答案,
在不就是不了了之。。。
简单点说下吧。
TService1.ServiceExecute(Sender: TService);
begin
end
中执行调用外部的一个窗口程序。
用
ShellExecute(0,nil,'E:\demoExe.exe', nil,nil,SW_SHOW);
现象是能调用起来,但是不显示窗口,任务管理器中可以看到。
在网上查了查,
这个方法好像是肯定不行了,貌似是因为在winService中没有desktop,
需要使用windows的其他账户重新创建一个进程。
然后我就调用了这个函数
RunAsUser('ADOMAIN', 'administrator', '123', 'e:\demoExe.exe');
具体代码-----------------------------------------
procedure RunAsUser(const Domain, Username, Password, Command: string);
var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
wDomain, wUsername, wPassword, wCommand: PWideChar;
begin
FillChar(StartupInfo, SizeOf(StartupInfo), #0);
StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_SHOWNORMAL;
GetMem(
wDomain,
Length(Domain) * SizeOf(WideChar) + SizeOf(WideChar));
GetMem(
wUsername,
Length(Username) * SizeOf(WideChar) + SizeOf(WideChar));
GetMem(
wPassword,
Length(Password) * SizeOf(WideChar) + SizeOf(WideChar));
GetMem(
wCommand,
Length(Command) * SizeOf(WideChar) + SizeOf(WideChar));
StringToWideChar(
Domain,
wDomain,
Length(Domain) * SizeOf(WideChar) + SizeOf(WideChar));
StringToWideChar(
Username,
wUsername,
Length(Username) * SizeOf(WideChar) + SizeOf(WideChar));
StringToWideChar(
Password,
wPassword,
Length(Password) * SizeOf(WideChar) + SizeOf(WideChar));
StringToWideChar(
Command,
wCommand,
Length(Command) * SizeOf(WideChar) + SizeOf(WideChar));
if not CreateProcessWithLogonW(
wUsername,
wDomain,
wPassword,
0,
nil,
wCommand,
0,
nil,
nil,
StartupInfo,
ProcessInfo) then RaiseLastOSError;
FreeMem(wDomain);
FreeMem(wUsername);
FreeMem(wPassword);
FreeMem(wCommand);
end;
-------------------------------------------------
但是结果是
窗口依旧没有显示出来,在任务管理器中能看到。
不知道谁成功的做过从windows service中调用外部的窗口程序。
求教各位大大了~~~
谢谢~~~~