ThomasReimann
asked on
Problem with FindWindow in A Service (Vista SP1)
Hi.
Here is my Delphi code:
procedure SendMessageToWindow(msg: LongWord;value:longword=0) ;
var Wnd: THandle;
begin
Wnd := FindWindow('myClass', NIL);
if Wnd > 0 then
begin
if IsWindowResponding(Wnd,100 ) then
SendMessage( HWND_BROADCAST,
RegisterWindowMessage('myA ppMessage' ),
msg,
value )
else
Error('hung!!');
end;
end;
It searches for the handle of a window and sends a message to that window.
The code works when used in an normal application (both in xp and vista).
The code works when used in a service application running windows xp.
The code does NOT work when used in a service application running vista (handle is always = 0).
Apparently Vista restricts Services so they cannot use the FindWindow api function anymore.
Is there a way around this? If not, which other (simple) way to send messages to an application from a service (so the app can go to front etc).
Thanks in advance.
Here is my Delphi code:
procedure SendMessageToWindow(msg: LongWord;value:longword=0)
var Wnd: THandle;
begin
Wnd := FindWindow('myClass', NIL);
if Wnd > 0 then
begin
if IsWindowResponding(Wnd,100
SendMessage( HWND_BROADCAST,
RegisterWindowMessage('myA
msg,
value )
else
Error('hung!!');
end;
end;
It searches for the handle of a window and sends a message to that window.
The code works when used in an normal application (both in xp and vista).
The code works when used in a service application running windows xp.
The code does NOT work when used in a service application running vista (handle is always = 0).
Apparently Vista restricts Services so they cannot use the FindWindow api function anymore.
Is there a way around this? If not, which other (simple) way to send messages to an application from a service (so the app can go to front etc).
Thanks in advance.
ASKER
I found the explanation here:
http://www.microsoft.com/whdc/system/vista/services.mspx
I still do need a work-around how to communicate something to an application without using something like tcp/ip.
http://www.microsoft.com/whdc/system/vista/services.mspx
I still do need a work-around how to communicate something to an application without using something like tcp/ip.
If you do not wnat to use TCP/IP you could use mailslots which are not like email.
I have used them and they work just great.
You could also use a components called TssSimpleIPC from SunnisSoft. This uses I believe Windows messaging.
http://www.sunisoft.com
http://www.torry.net/vcl/system/appscommunications/simpleipc.zip
It works very well in services and applications and it is free. Not sure what version of Delphi so could take some tweaking in newer versions.
John
I have used them and they work just great.
You could also use a components called TssSimpleIPC from SunnisSoft. This uses I believe Windows messaging.
http://www.sunisoft.com
http://www.torry.net/vcl/system/appscommunications/simpleipc.zip
It works very well in services and applications and it is free. Not sure what version of Delphi so could take some tweaking in newer versions.
John
What happens with your service when you compile as Interactive and run it in Vista?
The SimpleIPC uses FindWindow(). I have written several services and they run on Vista just fine using SimpleIPC but I have the service compiled as Interactive... never tried the other way since there is interaction between the service and other services and running applications.
Just really curious...
John
The SimpleIPC uses FindWindow(). I have written several services and they run on Vista just fine using SimpleIPC but I have the service compiled as Interactive... never tried the other way since there is interaction between the service and other services and running applications.
Just really curious...
John
ASKER
Vista does not allow interactive service anymore. I'll look at your suggestions.
So my services when running under Vista would run as a non interactive service?
I guess I had better read that Microsoft paper.
THANKS!
John
I guess I had better read that Microsoft paper.
THANKS!
John
ASKER
Rather they will not run at all. It's a security issue.
Hmmm...
Just to make certain that I was not blowing smoke, I checked one of my services that is written for Windows 2000 up to and including Vista.
I have an XP/Vista manifest compiled in as well (see snippet for manifest).
And Interactive := True.
The service works just fine under Vista! It starts, runs; does everything it is supposed to do. I read nothing about a manifest and I really didn't read anything stating that the service would not run. It would just not run as expected or the expected interactive behavior would not function.
Just for info and trying to learn along the way too!
John
Just to make certain that I was not blowing smoke, I checked one of my services that is written for Windows 2000 up to and including Vista.
I have an XP/Vista manifest compiled in as well (see snippet for manifest).
And Interactive := True.
The service works just fine under Vista! It starts, runs; does everything it is supposed to do. I read nothing about a manifest and I really didn't read anything stating that the service would not run. It would just not run as expected or the expected interactive behavior would not function.
Just for info and trying to learn along the way too!
John
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="2.0.1.1"
processorArchitecture="X86"
name="CDLibServerSvc.EXE"
type="win32"
/>
<description>A server service application for THE CD Library</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
ASKER
"Important Services cannot directly interact with a user as of Windows Vista. Therefore, the techniques mentioned in the section titled Using an Interactive Service should not be used in new code."
http://msdn.microsoft.com/en-us/library/ms683502(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms683502(VS.85).aspx
Thomas.
Thanks.. I saw, "Rather they will not run at all. It's a security issue." above but did not read that but did read, "Important Services cannot directly interact with a user as of Windows Vista....",
and therefore my confusion since even though Interactive is true, (so that I have one exe for multiple versions), all works just fine. Obviously I don't need Interactive := true and never changed it to see what would happen since I "assumed" (Hate that word) that the WindowsMessaging (SimpleIPC) would require that.
Interesting and thank-you!
Let us know what happens in your quest! ...out!
John
Thanks.. I saw, "Rather they will not run at all. It's a security issue." above but did not read that but did read, "Important Services cannot directly interact with a user as of Windows Vista....",
and therefore my confusion since even though Interactive is true, (so that I have one exe for multiple versions), all works just fine. Obviously I don't need Interactive := true and never changed it to see what would happen since I "assumed" (Hate that word) that the WindowsMessaging (SimpleIPC) would require that.
Interesting and thank-you!
Let us know what happens in your quest! ...out!
John
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
The service is marked as non-interactive (and works with XP perfectly).