oświadczyłem funkcję Process32FirstW
i strukturę PROCESSENTRY32W
takiego:`PROCESSENTRY32W` w języku 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;
}
Dzwoniąc Process32FirstW
(z procesu 64-bitowej), zawsze uzyskać TypeLoadException
mówiąc
Typ
ProcessEntry
mogłem” t być załadowany, ponieważ pole obiektu przy przesunięciu 44 jest wyrównane źle lub jest zachodzące na siebie przez inne pole, które nie jest polem obiektu.
Próbowałem też za pomocą char[]
zamiast string
dla ProcessEntry.ExeFile
i korzystania Pack=4
i Pack=8
w strukturze na StructLayoutAttribute
. I zawsze ustawione ProcessEntry.Size
do 568 i kopiowane dane korekcyjne z programu C++ (64-bitowy build):
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
nie mogę dowiedzieć się, co jest nie tak, więc jak deklarowaćPROCESSENTRY32W
w języku C# dla aplikacji 64-bitowej? Czy muszę używać C++/CLI, czy po prostu robię coś nie tak?
EDIT: Running ten kod jako program 64-bitowy działa perfekcyjnie dla mnie
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);
Twój struct nie pokrywa się z MSDN w [PROCESSENTRY32] (https://msdn.microsoft.com/en-us/library/windows/desktop/ ms684839 (v = vs.85) .aspx) wszędzie blisko. –
+ scott-chamberlain Dlaczego? dwSize ma rozmiar 4 bajtów, podobnie jak pole Size. Oba znajdują się w punkcie zerowym 0. PID ma również 4 bajty, takie jak moje i w offsecie 8. Macierzysty PID ma również rozmiar 4 bajtów i wydaje się być przesunięty 32 zgodnie z próbką C++. Użyłem 260 szerokich znaków w odsunięciu 44. Gdzie moja struktura różni się od tej w MSDN? – Cubinator73
Ignorujesz fakt, że 'ULONG_PTR' ma inną wielkość w systemach 32- i 64-bitowych, napisał pełną odpowiedź. –