DLL方法调用在从Windows服务调用时返回不同的结果

本文关键字:调用 返回 结果 服务 方法 Windows DLL | 更新日期: 2023-09-27 17:58:14

我有一个程序正在转换为Windows服务(C#)。此程序与外部DLL交互,该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访问权限,我认为这应该意味着它应该没有权限等问题。

感谢

DLL方法调用在从Windows服务调用时返回不同的结果

我猜问题是服务运行在不同的会话中,因此与它试图报告其状态的应用程序不同的桌面。

这个DLL可能会调用EnumWindow来查找应用程序,当从其他桌面运行时,将无法定位它。

好吧,由于我们对AppStateObject的内部结构一无所知,我只能做一个粗略的猜测。你告诉我们

该对象显示另一个正在运行的程序的状态

如果两个程序都在同一个用户上下文中运行,也许它只正确地显示了另一个程序的状态?当您将程序作为服务运行时,情况可能并非如此?