Programmieren - alles kontrollieren 4.940 Themen, 20.676 Beiträge

SUBST in C

Mdl / 8 Antworten / Baumansicht Nickles

Eigentlich sollte das doch ganz einfach sein: In C die Kommandozeilenfunktion SUBST, bzw eigentlich nur

  SUBST /D, d.h. das Ermitteln des einem virtuellen Laufwek zugewiesenen Verzeichnisses

zu realisieren.

Aber trotz intensiver Suche gestern z.B., hab ich nichts brauchbares gefunden.

Vielleicht hat von Euch jemand eine Idee.

Vielen Dank Euch,

Mdl

P.S. Idealerweise sollte dies ohne das Einbeziehen von Windows-Fkt. möglich sein, da ich es in ein Prg. einbauen will, das ohne diese auskommt. Wer aber (nur) eine Lösung innerhalb Windows hat, hilft mir dadurch schon auch...

bei Antwort benachrichtigen
mawe2 Mdl „SUBST in C“
Optionen
Aber trotz intensiver Suche gestern z.B., hab ich nichts brauchbares gefunden.

Was genau ist jetzt das Problem?

SUBST zeigt die eingerichteten Umleitungen an

SUBST /D hebt die jeweils eingerichtete Umleitung wieder auf

Was meinst Du mit

ohne das Einbeziehen von Windows-Fkt

?

Willst Du eine Alternative zu SUBST verwenden? Also auf SUBST verzichten?

Wo soll denn die Lösung "außerhalb von Windows" laufen? Auf Linux??

Gruß, mawe2

bei Antwort benachrichtigen
mi~we Mdl „SUBST in C“
Optionen
In C die Kommandozeilenfunktion SUBS

Dann nutze doch in C einfach die entsprechende Windows-API (DefineDosDevice bzw. QueryDosDevice):

https://msdn.microsoft.com/de-de/library/windows/desktop/aa363904%28v=vs.85%29.aspx

Idealerweise sollte dies ohne das Einbeziehen von Windows-Fkt. möglich sein, da ich es in ein Prg. einbauen will, das ohne diese auskommt.

Wie ist denn jetzt das zu verstehen? Unter welchem BS soll dein Programm denn laufen???

"Es wäre dumm, sich über die Welt zu ärgern. Sie kümmert sich nicht darum." (Marc Aurel)
bei Antwort benachrichtigen
Mdl mi~we „Dann nutze doch in C einfach die entsprechende Windows-API ...“
Optionen

Hallo Mi~we

und danke für den Windows-Tipp.

Ich will diese Funktionalität in ein (Hilfs)Programm einbauen, das auch außerhalb Windows, also - ich traue es mich kaum zu sagen - rein unter

  MS-DOS

läuft. Und da es das SUBST.EXE-Fossil auch dort schon gibt, muss es ja irgendwie auch schon programmierbar sein.

Irgendeine Idee?

Gruß,

Mdl

bei Antwort benachrichtigen
mi~we Mdl „Hallo Mi we und danke für den Windows-Tipp. Ich will diese ...“
Optionen
ich traue es mich kaum zu sagen - rein unter   MS-DOS

Ach, da werden Erinnerungen wach....

Irgendeine Idee?

Ja, das geht über den DOS-Interrupt 21h. Genaueres siehe hier, Abschnitt "Ortsbestimmung - Funktionen um SUBST"

http://lab1.de/Central/Ratgeber/Zum_Archiv/Alles_ueber_lange_Dateinamen/

"Es wäre dumm, sich über die Welt zu ärgern. Sie kümmert sich nicht darum." (Marc Aurel)
bei Antwort benachrichtigen
Mdl mi~we „Ach, da werden Erinnerungen wach.... Ja, das geht über den ...“
Optionen

Hi Mi~we,

merci für den Link.

Nach einigem Rumprobieren mit meinem Compiler, hab ich auch die richtige Syntax gefunden, aber noch Probleme bei der Zuweisung von ds:dx: Im Link steht ja bei 'Query SUBST':

DS:DX muß auf einen ausreichend großen Puffer zeigen, der den substituierten Pfad als ASCIZ-String aufnimmt.

Meine Versuche für diese Anweisung sind bisher schon an der Semantik gescheitert:

char buffer[MAX_PATH];

asm {
    mov ax, 71AAh;
    mov bh, 02h; // => 0: Create SUBST, 1: Terminate SUBST, 2: Query SUBST
    mov bl, 26; // DRIVE: 00=A:, ..., 26=Z

    // FEHLER! WIE GEHT DAS? 
    mov ds:dx, buffer; // DS:DX den Speicher von 'buffer' zuweisen...

    int 21h;
};
printf("SUBST of Z: is %s.", buffer);

(Meine Vermutung war, dass ich die 32-Bit-Adresse von buffer in zwei 16-Bit Werte aufteilen muss und diese dann DS und BX zuweisen muss, aber auch das ist gescheiert (und sogar bei so simplen Anweisungen wie 'mov ds,0' gab's 'nen Compiler-Fehler)

Ist ja auch schon ein Weilchen her, dass ich mit Assembler und Registern zu tun hatte.
Und programmiert hab ich damals mit Motorolla's Z80-Prozessor ;-)

Was wäre also die korrekte Anweisung?

Gruß,

Mdl

bei Antwort benachrichtigen
mi~we Mdl „Hi Mi we, merci für den Link. Nach einigem Rumprobieren mit ...“
Optionen

Auuuu Backe! Das ist bei mir gefühlte 100 Jahre her, daß ich mich mal mit C und Assembler und sonem Zeug beschäftigt habe.

In die Register ds und dx muss die Speicheradresse nach dem Segment:Offset Schema. Wie du jetzt aber bei Inline Assembler an die Segment/Offset-Werte kommst ....

sogar bei so simplen Anweisungen wie 'mov ds,0' gab's 'nen Compiler-Fehler

Wie ich mich noch vage zu erinnern meine, sind Segmentregister wie ds etwas zickig und eine direkte Zuweisung wie mov ds, 0 geht nicht. Es geht aber so was wie mov ds, ax (also von einem Register nach ds).

Und damit enden meine vagen Erinnerungen leider auch schon ....

Ich fürchte, da muss sich hier noch jemand melden, der auf dem Gebiet fitter ist als ich.

"Es wäre dumm, sich über die Welt zu ärgern. Sie kümmert sich nicht darum." (Marc Aurel)
bei Antwort benachrichtigen
Mdl mi~we „Dann nutze doch in C einfach die entsprechende Windows-API ...“
Optionen

Hallo Mi~we

nochmal danke für den Windows-Tipp.

Habe ihn inzwischen auch ausprobiert: Da ich ja nur die Option Display(=/D)-Option von SUBST benötige, ist das also die Fkt. QueryDosDevice() und das klappt gut.

Etwas neugierig wie ich bin: Warum hat der gelieferte Pfad eigentlich so ein seltsames '\??\'-Präfix, also z.B. statt 'c:\mydir1\mydir2': '\??\c:\mydir1\mydir2'? Aber das nur am Rande...

Gruß,

Mdl

 P.S. Habe unser Assembler-Problem gerade neu gepostet... Vielleicht findet sich ja ein Assembler-Kundiger

bei Antwort benachrichtigen
mi~we Mdl „Hallo Mi we nochmal danke für den Windows-Tipp. Habe ihn ...“
Optionen
also die Fkt. QueryDosDevice() und das klappt gut.

Na wenigstens was!

Warum hat der gelieferte Pfad eigentlich so ein seltsames '\??\'-Präfix

Und schon wieder erwischt du mich auf dem falschen Fuß ...

Habe unser Assembler-Problem gerade neu gepostet

Dann drücke ich mal die Daumen. Irgendwie muss es ja gehen.

"Es wäre dumm, sich über die Welt zu ärgern. Sie kümmert sich nicht darum." (Marc Aurel)
bei Antwort benachrichtigen