我有一个程序我正在转换为Windows服务(在C#中)。此程序与具有返回对象的方法的外部DLL交互。该对象显示另一个正在运行的程序的状态(是否正在运行,以及该程序是否已登录)
通过之前的实施,一切正常。用于获取具有状态变量的对象的DLL调用工作正常。现在我已将该方法调用移动到Windows服务,它返回错误的值。 DLL方法调用返回状态对象,但值始终显示程序未运行或登录(显然是)。
我不知道为什么在Windows服务中调用此DLL方法应该更改返回的变量。
我能做些什么来确保DLL调用按预期工作吗?
我无法访问DLL代码,因此无法在那里进行更改。
以下是一个例子:
AppStateDLL.AppStateObject stateObject = new AppStateDLL.AppStateObject();
if (!stateObject.Online || !stateObject.LoggedIn)
{
//things are broken, because the program is always running and logged in
}
(名字已经编好,但你明白了)
如果我在Windows窗体对象中运行此代码,则stateObject将Online和LoggedIn属性设置为true,因此每个方面都很好。如果我从Windows服务中运行代码,则会为两个变量返回false。
我的Windows服务设置了LocalSystem访问权限,我认为这应该意味着它应该没有权限等问题。
由于
答案 0 :(得分:1)
好吧,既然我们对AppStateObject
的内部结构一无所知,我只能粗略猜测。你告诉我们了
该对象显示另一个正在运行的程序的状态
如果两个程序在同一个用户上下文中运行,它可能只显示其他程序的状态?当您将程序作为服务运行时可能不是这种情况?
答案 1 :(得分:1)
我猜测问题是该服务在不同的会话中运行,因此与应用程序的状态不同的桌面正在尝试报告。
此DLL可能会调用EnumWindow来查找应用程序,但从其他桌面运行时,这将无法找到它。