Я объявил функцию Process32FirstW
и структуру PROCESSENTRY32W
так:`PROCESSENTRY32W` в C#?
[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
не мог» t, потому что поле объекта со смещением 44 выровнено неправильно или перекрывается другим полем, которое не является полем объекта.
Я также попытался использовать char[]
вместо string
для ProcessEntry.ExeFile
и использования Pack=4
и Pack=8
в этой структуры StructLayoutAttribute
. Я всегда устанавливается ProcessEntry.Size
568 и я скопировал компенсирующие данные из программы на C++ (64-разрядная версия):
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 или я просто делаю что-то неправильно здесь?
EDIT: Выполнение этого кода в виде 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);
Ваш структура не соответствует MSDN-х [PROCESSENTRY32] (https://msdn.microsoft.com/en-us/library/windows/desktop/ ms684839 (v = vs.85) .aspx) где угодно. –
+ scott-Chamberlain Почему? dwSize имеет размер 4 байта, как и поле «Размер». Оба они расположены со смещением 0. PID также имеет 4 байта, как и мой, и со смещением 8. Родительский PID также имеет размер 4 байта и, кажется, находится в смещении 32 в соответствии с образцом C++. Я использовал 260 широких символов при смещении 44. Где моя структура отличается от той, что находится в MSDN? – Cubinator73
Вы игнорируете тот факт, что 'ULONG_PTR' имеет разный размер в 32 и 64-битных системах, написал полный ответ. –