我声明了这样的函数Process32FirstW
和结构PROCESSENTRY32W
:
[DllImport("KERNEL32.DLL", CallingConvention = CallingConvention.StdCall, EntryPoint = "Process32FirstW")]
private static extern bool Process32FirstW (IntPtr hSnapshot, ref ProcessEntry pProcessEntry);
[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Unicode, Size = 568)]
internal struct ProcessEntry {
[FieldOffset(0)] public int Size;
[FieldOffset(8)] public int ProcessId;
[FieldOffset(32)] public int ParentProcessID;
[FieldOffset(44), MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string ExeFile;
}
调用时Process32FirstW
(使用 64 位进程),我总是会TypeLoadException
说
ProcessEntry
无法加载该类型,因为偏移量 44 处的对象字段对齐错误或与另一个字段重叠,该字段不是对象字段。
我还尝试在char[]
结构string
的. 我总是设置为 568,并从 C++ 程序(64 位构建)中复制了偏移数据:ProcessEntry.ExeFile
Pack=4
Pack=8
StructLayoutAttribute
ProcessEntry.Size
typedef unsigned long long ulong;
PROCESSENTRY32W entry;
wcout << sizeof(PROCESSENTRY32W) << endl; // 568
wcout << (ulong)&entry.dwSize - (ulong)&entry << endl; // 0
wcout << (ulong)&entry.th32ProcessID - (ulong)&entry << endl; // 8
wcout << (ulong)&entry.th32ParentProcessID - (ulong)&entry << endl; // 32
wcout << (ulong)&entry.szExeFile - (ulong)&entry << endl; // 44
我不知道出了什么问题,那么如何 PROCESSENTRY32W
在 C# 中为 64 位应用程序声明?我必须使用 C++/CLI 还是我只是在这里做错了什么?
编辑:将此代码作为 64 位程序运行对我来说非常好
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32W entry;
entry.dwSize = sizeof(PROCESSENTRY32W);
if (Process32FirstW(hSnapshot, &entry)) {
do {
// Do stuff
} while (Process32NextW(hSnapshot, &entry));
}
CloseHandle(hSnapshot);