ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > Executablename aus Prozessstruktur ermitteln? | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
09.06.2005, 11:25 Uhr DariusBrewka Posts: 899 [Benutzer gesperrt] |
Hallo gibt es einem Möglichkeit aus der Prozessstruktur/TaskStruktur den dazugehörigen Namen des Files zu erfahren, d.h. nicht wie der Task heisst sondern wie das Programm auf der Platte heisst? in task->tc_Node.ln_Name, kann man oft den Namen haben, aber halt nicht immer. danke Darius [ - Antworten - Zitieren - Direktlink - ] |
09.06.2005, 12:40 Uhr Holger Posts: 8116 Nutzer |
Du kannst auf jeden Fall gucken, ob der pr_CLI Eintrag!=NULL ist und wenn ja, dann cli_CommandName auswerten. Allerdings ist das auch nicht immer identisch mit dem Dateinamen... mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
09.06.2005, 13:19 Uhr gni Posts: 1106 Nutzer |
Zitat:Für Workbench-gestartete Programme könntest Du in der WB-Startupmessage nachschauen. [ - Antworten - Zitieren - Direktlink - ] |
09.06.2005, 13:32 Uhr tokai Posts: 1071 Nutzer |
@DariusBrewka: das sollte funktionieren: code:BPTR dlock, oldlock; STRPTR progname = NULL; STRPTR prognamebuf; if ( (prognamebuf = AllocVec(PROGNAMELENGTH,MEMF_PUBLIC)) ) { /* * get progname and progdir */ if (prCLI) { dlock = GetProgramDir(); if (GetProgramName(prognamebuf,PROGNAMELENGTH)) { progname = FilePart(prognamebuf); } } else { progname = wbmsg->sm_ArgList->wa_Name; dlock = wbmsg->sm_ArgList->wa_Lock; } /* change to PROGDIR: */ oldlock = CurrentDir(dlock); /* call main */ rc = MyMain(progname); (void)CurrentDir(oldlock); FreeVec(prognamebuf); } else { Printf("Not enough memory.\n"); } (variable prCLI ist TRUE wenn das program vom CLI gestartet wurde) -- http://www.christianrosentreter.com ~ MorphOS und AmigaOS Software [ - Antworten - Zitieren - Direktlink - ] |
09.06.2005, 13:40 Uhr Holger Posts: 8116 Nutzer |
@tokai, gni: Ich glaube, Darius ging es nicht unbedingt um seinen eigenen task. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
09.06.2005, 15:29 Uhr thomas Posts: 7716 Nutzer |
Wenn es nur um den Namen geht, also um für ein Shell-Fenster das Kommando und nicht lapidar "Shell Process", dann kann man es so machen:code:#define taskname(task) \ (((struct Task *)task)->tc_Node.ln_Type == NT_PROCESS && ((struct Process *)task)->pr_CLI ? \ ((UBYTE *)BADDR(((struct CommandLineInterface *)BADDR(((struct Process *)task)->pr_CLI))->cli_CommandName)) + 1 : \ ((struct Task *)task)->tc_Node.ln_Name) (das habe ich für Debug-Zwecke benutzt. Für produktiven Einsatz muß man da sicher noch ein paar if's einfügen. Damit kommt man aber u.U. auch nicht auf den Pfad und den Namen des Programms. Um einen Namen zu haben, den man z.B. mit GetDiskObject für das eigene Icon benutzen kann, habe ich dieses benutzt: code:int main (int argc,char **argv) { struct WBArg Program; if (argc) { Program.wa_Lock = Lock("PROGDIR:",SHARED_LOCK); Program.wa_Name = argv[0]; } else Program = ((struct WBStartup *)argv)->sm_ArgList[0]; /* hier ist das Programm */ /* z.B.: */ oldcd = CurrentDir (Program.wa_Lock); dob = GetDiskObjectNew (Program.wa_Name); CurrentDir (oldcd); if (argc) { if (Program.wa_Lock) UnLock (Program.wa_Lock); } return (0); } Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ Dieser Beitrag wurde von thomas am 09.06.2005 um 15:29 Uhr editiert. ] [ - Antworten - Zitieren - Direktlink - ] |
10.06.2005, 11:08 Uhr DariusBrewka Posts: 899 [Benutzer gesperrt] |
Ich bin mal wieder ein I***t, wie Holger gesagt hat geht es mir nicht um den Namen meines eigenen Tool, da ist es nicht so sehr schwer. Tschuldigung für die gemacht Mühe an Alle. Wie auch immer, mein Tool stellt Alle geöffneten Fenster in einer Liste dar und dazu das Icon des gestareten Programms. Leider gibt es da Icons die ich nicht laden kann, da ich den Namen nicht herbekomme. [ - Antworten - Zitieren - Direktlink - ] |
10.06.2005, 12:47 Uhr thomas Posts: 7716 Nutzer |
Die erste Frage wäre dann schonmal, wie du vom Fenster auf die Task kommst. Ich habe mal probiert, sowas zu schreiben. Das scheint das beste zu sein, was geht: code:#include <proto/exec.h> #include <proto/dos.h> #include <intuition/intuitionbase.h> #include <dos/dosextens.h> #include <string.h> extern struct IntuitionBase *IntuitionBase; get_name (BPTR dir,char *file,char *buffer,long size) { BPTR oldcd; BPTR lock; if (dir) oldcd = CurrentDir(dir); if (lock = Lock (FilePart(file),SHARED_LOCK)) { NameFromLock (lock,buffer,size); UnLock (lock); } else if (dir) { NameFromLock (dir,buffer,size); /* only for debug purposes */ AddPart (buffer,"",size); } if (dir) CurrentDir (oldcd); } int main (void) { struct Screen *scr = IntuitionBase->FirstScreen; struct Window *win; struct Process *pr; char *winname; char *prname; char cmdname[256]; Printf ("%-25.25s %-25.25s %s\n","Window Name","Task Name","Command"); for (win = scr->FirstWindow; win; win = win->NextWindow) { winname = win->Title ? win->Title : "(unknown)"; prname = "(unknown)"; strcpy (cmdname,"(unknown)"); if (win->UserPort) if (pr = (struct Process *)win->UserPort->mp_SigTask) { prname = pr->pr_Task.tc_Node.ln_Name; if (pr->pr_Task.tc_Node.ln_Type == NT_PROCESS) { get_name (pr->pr_HomeDir,pr->pr_CLI ? ((UBYTE *)BADDR(((struct CommandLineInterface *)BADDR(pr->pr_CLI))->cli_CommandName)) + 1 : prname,cmdname,256); } } Printf ("%-25.25s %-25.25s %s\n",winname,prname,cmdname); } return (0); } Beispiel: code:Window Name Task Name Command (unknown) LimpidClock Workbench:Wbstartup/LimpidClock (unknown) Workbench Workbench:C/ Prefs Workbench Workbench:C/ Workbench 49 % voll, 24. Workbench Workbench:C/ CygnusEd Professional V4. CygnusEd ver. 3.5+ Work:CygnusEd/CED s:user-startup Shell Process Workbench:Utilities/Multiview AmigaShell (unknown) (unknown) (unknown) Background CLI Work:Sources/picshow/PicShow AmigaShell (unknown) (unknown) (unknown) Amidock Workbench:Wbstartup/Amidock Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Antworten - Zitieren - Direktlink - ] |
11.06.2005, 00:35 Uhr DariusBrewka Posts: 899 [Benutzer gesperrt] |
Zitat: Im Grunde wie du es auch unten geschrieben hast, über den WindowPort was ich aber noch nicht getestet habe ist den Namen über die CLI Struktur zu erhalten, ggf. sieht das Resultat in Einzelfällen etwas besser aus. Wie auch immer finde ich es sehr Freundlich von dir dir immer so viel Mühe zu geben den Leuten so zu helfen, dass du auch noch die Sachen austestest. [ - Antworten - Zitieren - Direktlink - ] |
11.06.2005, 13:51 Uhr thomas Posts: 7716 Nutzer |
Also bei mir ist der WindowPort fast nie gefüllt. Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Antworten - Zitieren - Direktlink - ] |
11.06.2005, 19:22 Uhr DariusBrewka Posts: 899 [Benutzer gesperrt] |
Zitat: Ok, derjenige wo man seine IDCMP-Window-Messages abholt, hab jetzt auf die Schnelle nicht den richtigen Namen gewusst. [ - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > Executablename aus Prozessstruktur ermitteln? | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |