Hallo,
ich versuche zurzeit in C# die Funktion(en) der Winapi zum Auslesen der Prozesstabelle zu nutzen.
Dazu habe ich folgende Klasse geschrieben:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct PROCESSENTRY32W
{
public ulong dwSize;
public ulong cntUsage;
public ulong th32ProcessID;
public UIntPtr th32DefaultHeapID;
public ulong th32ModuleID;
public ulong cntThreads;
public ulong th32ParentProcessID;
public long pcPriClassBase;
public ulong dwFlags;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szExeFile;
};
[DllImport("kernel32.dll")]
static extern int CreateToolhelp32Snapshot(int flags, int pid);
[DllImport("kernel32.dll")]
static extern bool Process32First(int snapshot, ref PROCESSENTRY32W proc);
[DllImport("kernel32.dll")]
static extern bool Process32Next(int snapshot, ref PROCESSENTRY32W proc);
private List<string> ProcessList;
public ProcessInfo()
{
ProcessList = new List<string>();
PROCESSENTRY32W lsPE = new PROCESSENTRY32W();
int Snapshot = CreateToolhelp32Snapshot(0x02, 0);
lsPE.dwSize = (ulong)Marshal.SizeOf(lsPE);
if (Process32First(Snapshot, ref lsPE))
{
ProcessList.Add(lsPE.szExeFile);
while (Process32Next(Snapshot, ref lsPE))
{
ProcessList.Add(lsPE.szExeFile);
}
}
}
Frage1:
Die Struktur, welche ich oben nach c# portiert habe benutzt jenachdem ob UNICODE definiert ist ein WCHAR Array oder ein CHAR Array der Länge 260.
Kann ich in c# ähnlich wie in c++ "UNICODE" als Präprozessordirektive in den Projektmappeneigenschaften eintragen? (bzw. hat es dort einen Effekt auf die DLL Funktion?)
Die Originalstruktur sieht so aus (mit Unicode):
typedef struct tagPROCESSENTRY32W
{
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID; // this process
ULONG_PTR th32DefaultHeapID;
DWORD th32ModuleID; // associated exe
DWORD cntThreads;
DWORD th32ParentProcessID; // this process's parent process
LONG pcPriClassBase; // Base priority of process's threads
DWORD dwFlags;
WCHAR szExeFile[MAX_PATH]; // Path
} PROCESSENTRY32W;
Frage2:
Die Funktionen liefern mit true zurück, jedoch wird nicht in die Struktur geschrieben. Was mache ich falsch?
MfG Snowball
Mal ne ganz dumme Frage. Warum nicht System.Diagnoctics.Process.GetProcesses() ?
lg pdelvo
Weil ich das bis vor ner Minute noch nicht kannte... Danke.
Wär trotz allem interessant wie die Antwort(en) auf meine Frage(n) aussehen.
Weil deine Umsetzungen der C Datentypen auf die .net Datentypen volkommen falsch sind.
Ein DWORD entspricht Uint32, ein HANDLE ein IntPtr, ein ULONG_PTR ein IntPtr, usw.
Und wenn du statt Process32First Process32FirstW (die UNICODE Version) nimmst hast du auch kein Problem mit der ASCII/Inicode Umsetzung.
Hier ist ein exzellenter Artikel im MSDN er alles nötige erklärt:
Calling Win32 DLLs in C# with P/Invoke
using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}
Danke.
Ich hatte einen ähnlichen Beitrag gelesen (sogar teilweise mit den gleichen Beispielen), aber der hinter deinem Link ist deutlich besser und ausführlicher.