- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试调用 WTSEnumerateProcesses()
,但在将类型 ProcessInfo
转换为 WTS_PROCESS_INFO
时遇到了一些问题。
这是我目前的代码:
进程信息
class ProcessInfo
{
public int basePriority;
public int handleCount;
public int mainModuleId;
public long pageFileBytes;
public long pageFileBytesPeak;
public long poolNonpagedBytes;
public long poolPagedBytes;
public long privateBytes;
public int processId;
public string processName;
public int sessionId;
public ArrayList threadInfoList;
public long virtualBytes;
public long virtualBytesPeak;
public long workingSet;
public long workingSetPeak;
public ProcessInfo()
{
}
}
WTS_PROCESS_INFO
public struct WTS_PROCESS_INFO
{
public int SessionID;
public int ProcessID;
// This is spointer to a string...
public IntPtr ProcessName;
public IntPtr userSid;
}
WTSEnumerateProcesses()
[DllImport("wtsapi32.dll", SetLastError = true)]
static extern bool WTSEnumerateProcesses(
IntPtr serverHandle, // Handle to a terminal server.
Int32 reserved, // must be 0
Int32 version, // must be 1
ref IntPtr ppProcessInfo, // pointer to array of WTS_PROCESS_INFO
ref Int32 pCount // pointer to number of processes
);
public static WTS_PROCESS_INFO[] WTSEnumerateProcesses()
{
IntPtr pProcessInfo = IntPtr.Zero;
int processCount = 0;
var hServer = OpenServer("XA7-06");
if (!WTSEnumerateProcesses(hServer, 0, 1, ref pProcessInfo, ref processCount))
return null;
IntPtr pMemory = pProcessInfo;
WTS_PROCESS_INFO[] processInfos = new WTS_PROCESS_INFO[processCount];
for (int i = 0; i < processCount; i++)
{
processInfos[i] = (ProcessInfo)Marshal.PtrToStructure(pProcessInfo, typeof(WTS_PROCESS_INFO));
pProcessInfo = (IntPtr)((int)pProcessInfo + Marshal.SizeOf(processInfos[i]));
}
WTSFreeMemory(pMemory);
return processInfos;
}
我的问题是在这一行的 WTSEnumerateProcesses()
方法即将结束时:
processInfos[i] = (ProcessInfo)Marshal.PtrToStructure(pProcessInfo, typeof(WTS_PROCESS_INFO));
我认为我可能错过了定义 WTS_PROCESS_INFO
和 ProcessInfo
之间关系的步骤,但我不确定该怎么做。有人能指出我正确的方向吗?
这是我看到的错误:
// Cannot implicitly convert type 'ProcessInfo' to 'WTS_PROCESS_INFO'
最佳答案
您的 ProcessInfo
类型与 WTS_PROCESS_INFO
无关。所以这一行:
processInfos[i] = (ProcessInfo)Marshal.PtrToStructure(pProcessInfo,
typeof(WTS_PROCESS_INFO));
实际上包含两个错误。编译器选择一个。具体来说,processInfos[i]
属于 WTS_PROCESS_INFO
类型,并且分配与 ProcessInfo
不兼容。另一个错误有点微妙。您将 Marshal.PtrToStructure()
返回的值转换为 ProcessInfo
类型是错误的。 Marshal.PtrToStructure()
返回的值是一个装箱的 WTS_PROCESS_INFO
。所以那行代码应该是:
processInfos[i] = (WTS_PROCESS_INFO)Marshal.PtrToStructure(pProcessInfo,
typeof(WTS_PROCESS_INFO));
您的指针算法在 64 位进程中可能会失败。如果您使用的是最新版本的 .net,您可以直接在 IntPtr 上执行算术运算:
pProcessInfo += Marshal.SizeOf(processInfos[i]);
或者,如果您的目标是较旧的 .net 版本,您应该通过转换为 ulong
而不是 int
在 64 位上下文中执行算术。
至于您的 ProcessInfo
类型,我认为这只是您的错误想法。这种类型在这里似乎没有用。
如果我是你,我会强制使用 WTSEnumerateProcessesW
的 Unicode 版本,例如:
[DllImport("wtsapi32.dll", EntryPoint = "WTSEnumerateProcessesW", SetLastError = true)]
static extern bool WTSEnumerateProcesses(
....
);
要将进程名称作为字符串读取,请将 WTS_PROCESS_INFO
结构中返回的指针传递给 Marshal.PtrToStringUni
。
关于c# - 如何将 ProcessInfo 转换为 WTS_PROCESS_INFO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35576012/
为了在单元测试中测试一些类,我写了一个模拟的 Coredata 管理器。 我有大约 10 个类从名为 DatabaseManager 的类中获取 NSManagedObjectContext。我已经决
我想知道它们有什么不同 CommandLine ProcessInfo let elements = CommandLine.arguments let elements = Processinfo.
我正在开发一个需要在低内存设备上定制的应用程序。可用的设备内存将通过以下方式快速给出: ProcessInfo.processInfo.physicalMemory 例如: iPhone SE 提供
我有一个应用程序在命令窗口中调用另一个进程,并且该进程更新了输出到控制台窗口的统计信息。我认为这是一个相当简单的操作,但我似乎无法让它工作。我错过了什么吗? string assemblyLocati
我正在尝试调用 WTSEnumerateProcesses(),但在将类型 ProcessInfo 转换为 WTS_PROCESS_INFO 时遇到了一些问题。 这是我目前的代码: 进程信息
我正在尝试在 Swift 中为 MacOS 构建一个应用程序来记录有关正在运行的应用程序的一些信息。我想获取的一些信息与相应的进程(用户等)有关,但似乎无法从NSRunningApplication
我以前成功使用过 wkhtmltopdf,但现在我有一个场景,我需要在启动该过程时使用特定的帐户。当我设置有效的用户名/密码时,标准输出流为空,返回码为 -1。一旦我注释掉用户名/密码,它就会按预期工
我正在尝试在 JBoss7 应用程序服务器上部署的 jBPMv5.x 上执行简单的人工任务 bpmn。数据库是Postgresql V9.2。我发现任务正在提交到数据库,但即使在调用 ksession
我有一个使用 Swift 2.2 构建的 iOS 应用程序,最近开始出现问题。它在通过 Xcode 构建和运行时工作正常,但在从 Xcode 停止应用程序然后尝试直接从手机(真实设备和模拟器)再次打开
在 Swift 4 中,我使用 ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] 得到了错误的 iPhone 5s、iOS 11 iOS
我是一名优秀的程序员,十分优秀!