#include <exec/types.h> #include <dos/dos.h> #include <dos/dosextens.h> #include <proto/dos.h> #include <proto/exec.h> void addPath(BPTR newPath) { struct Process *proc = (struct Process *)FindTask(NULL); struct CommandLineInterface *cli = (struct CommandLineInterface *)BADDR(proc->pr_CLI); BPTR *oldPathList, *newPathList; LONG oldPathCount = 0; LONG i; // Get the current path list oldPathList = (BPTR *)BADDR(cli->cli_CommandDir); // Count the current paths while (oldPathList[oldPathCount] != (BPTR)NULL) { oldPathCount++; } // Allocate new path list (old paths + new path + null terminator) newPathList = AllocVec(sizeof(BPTR) * (oldPathCount + 2), MEMF_CLEAR); if (!newPathList) { return; // Memory allocation failed } // Copy old paths to new path list for (i = 0; i < oldPathCount; i++) { newPathList[i] = oldPathList[i]; } // Add new path newPathList[oldPathCount] = newPath; // Update the CLI structure with the new path list cli->cli_CommandDir = MKBADDR(newPathList); // Free the old path list FreeVec(oldPathList); } int main() { BPTR newPath; // Convert the directory string to a lock (e.g., "SYS:C/") newPath = Lock("SYS:C/", ACCESS_READ); if (newPath) { addPath(newPath); // Clean up UnLock(newPath); } return 0; }
@Rafael/ARMO, post #1
(...) IF wbmessage<>NIL ->Start z WB, próba przekształcenia w CLI wb_into_CLI() ENDIF (...)
PROC wb_into_CLI() DEF wbCLI=NIL:PTR TO commandlineinterface, wbPort=NIL:PTR TO mp, wbProc=NIL:PTR TO process, wbMsg=NIL:PTR TO wbstartup process := FindTask(NIL); cli := BADDR (process.cli) -> jesli masz cli, to nie mieszaj IF cli THEN RETURN; /* kopiowanie cli Workbencha do procesu */ wbMsg:=wbmessage Forbid() IF (wbPort := wbMsg.message.replyport) IF ((wbPort.flags AND PF_ACTION) = PA_SIGNAL) IF (wbProc := wbPort.sigtask) IF (wbProc.task.ln.type = NT_PROCESS) IF (wbCLI := BADDR(wbProc.cli)) process.cli:=wbProc.cli ENDIF ENDIF ENDIF ENDIF ENDIF Permit() ENDPROC
@vojo, post #2
(struct Process *)FindTask("Workbench")
@Rafael/ARMO, post #4
@Rafael/ARMO, post #1
@cholok, post #6
@cholok, post #6
@Rafael/ARMO, post #4
wydaje mi się że zamiast przechodzić po kolejnych zagłębieniach w strukturach aby dostać proces Workbench, można to samo uzyskać czytelniej za pomocą:
(struct Process *)FindTask("Workbench")
Druga sprawa dotyczy listy z wbProc.cli (wpProc->pr_CLI) i zwykłego skopiowanie wskaźnika do własnego procesu (co jest w Twoim kodzie: process.cli:=wbProc.cli). Czy czasem jak nasz proces zostanie zamknięty, to nie nastąpi zwolnienie pamięci tej listy
@vojo, post #10
No jeśli program zwalniałby zasoby których nie alokował, to wg mnie byłby to błąd.
E takich rzeczy nie robi, automatycznie zwalnia tylko zasoby jawnie zaalokowane (np. przez funkcje New() czy String()).
PS. Ciekawe jak to by zadziałało przy "zamiennikach" Workbencha typu Scalos czy Magellan...
edit: chodzi mi o to czy Scalos zwróci coś dla FindTask("Workbench")
@Rafael/ARMO, post #8
Można owszem przekazać NP_Path w przypadku SystemTags() ale dla Execute() już tak nie jest.
Dlatego zależy mi aby Path był ustawiony w obrębie naszego procesu.
@Hexmage960, post #12
Hej, jeśli chodzi o Execute(), to podobnie jak polecenie EXECUTE wykonuje ono skrypt AmigaDOSa. Więc prawdopodobnie możesz użyć polecenia PATH do uzupełnienia ścieżki. [...]
@Rafael/ARMO, post #13
@vojo, post #14
void PrintPathLockList() { Forbid(); const struct Task *pWorkbenchTask = (struct Task *)FindTask("Workbench"); Permit(); if (!pWorkbenchTask || pWorkbenchTask->tc_Node.ln_Type != NT_PROCESS) return; const struct Process *pWorkbenchProcess = (struct Process *)pWorkbenchTask; const struct CommandLineInterface *pCli = (struct CommandLineInterface *)BADDR(pWorkbenchProcess->pr_CLI); if (!pCli) return; char buffer[256]; const struct FileLock *pFileLock = (struct FileLock *)BADDR(pCli->cli_CommandDir); while (pFileLock) { printf("lock: 0x%08x", pFileLock->fl_Key); if (NameFromLock(pFileLock->fl_Key, buffer, sizeof(buffer))) printf(" name: %s\n", buffer); else printf("\n"); pFileLock = (struct FileLock *)BADDR(pFileLock->fl_Link); } }
@Rafael/ARMO, post #16
BPTR script = Open("SkryptDOS", MODE_OLDFILE); Execute("", script, Output());