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;
}
(64ビットプロセスで)呼び出すときProcess32FirstW
、私はいつもTypeLoadException
ことわざを受け取ります
ProcessEntry
オフセット 44 のオブジェクト フィールドが正しく配置されていないか、オブジェクト フィールドではない別のフィールドと重なっているため、型を読み込むことができませんでした。
また、 forchar[]
の代わりに使用して、構造体の でand を使用してみました。私は常に568 に設定し、C++ プログラム (64 ビット ビルド) からオフセット データをコピーしました。string
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
何がうまくいかないのかわからないので、64 ビット アプリケーションの C# で宣言する方法を教えてください。 C++/CLI を使用する必要がありますか、それとも単にここで何か間違ったことをしているのですか?PROCESSENTRY32W
編集:このコードを 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);