amiga-news 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:
DariusBrewka:
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?

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:
Original von thomas:

Die erste Frage wäre dann schonmal, wie du vom Fenster auf die Task kommst.


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:
Also bei mir ist der WindowPort fast nie gefüllt.

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.
.