如何获取SUBST盘(100分)

  • 主题发起人 主题发起人 龙丹
  • 开始时间 开始时间

龙丹

Unregistered / Unconfirmed
GUEST, unregistred user!
假如执行了 subst x: d:/projects<br>怎样才能获知 “x:” 就是 “d:/projects” 呢?<br>有没有这样的API可调用?<br>
 
应该没有的, subst是个DOS命令, API是windows中的东西<br>
 
映射以后在注册表中会有记录!
 
那以前在dos里执行时注册表在那里?<br>DOS程序就是DOS程序, 与Windows无关。
 
&gt;&gt; 映射以后在注册表中会有记录!<br>这是凭空想像的吧。<br><br>我在MSDN里翻了一遍,最后也只是知道SUBST的功能是在ULIB.DLL中,却不知道函数的形式,<br>Delphi也没有输入此DLL的任何函数。<br><br>是不是没有人使用 SUBST 啊?
 
呵呵!不好意思!跑题了!我说的是WIN下的映射磁盘目录。<br>SUBST现在用的人肯定很少了,DOS现在没几个人用了!<br>不过并不代表WIN下无法调用!<br>如:<br><br>uses ShellApi;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>&nbsp; a,b,c,d : array[0..255] of char;<br>begin<br>&nbsp; strpcopy( a, 'open' );<br>&nbsp; strpcopy( b, 'subst' );<br>&nbsp; strpcopy( c, 'k: c:/mydir' );<br>&nbsp; strpcopy( d, 'c:/winnt' );<br>&nbsp; ShellExecute( 0, a, b, c, d, SW_SHOWNORMAL);<br>end;<br>
 
呵呵,没有DLL定义,并不是说不能用,只不过是不能直接用了,你要在其它地方找到该DLL的定义。<br>我想一定是有联系的.<br><br>
 
to YB_unique:<br>》呵呵!不好意思!跑题了!<br>这回你还是跑题了!我是要检查 k: 是不是 SUBSTed 盘。<br>我现在也是用ShellExecute间接实现,很麻烦,不爽啊!<br><br>to menxin:<br>我就是因为找不到有关函数定义才提出这个问题的呀,给点线索吧。<br>
 
&gt;&gt;呵呵,没有DLL定义,并不是说不能用,只不过是不能直接用了,你要在其它地方找到该DLL的定义。<br>&gt;&gt;我想一定是有联系的.<br>subst与注册表无关, 也与DLL无关啊!<br>dll是自从有了windows才有的东西, 同志们,看来你们用DOS的时间太少了,<br>完全是基本概念不清楚啊
 
&gt;&gt;subst与注册表无关, 也与DLL无关啊!<br>dll是自从有了windows才有的东西, 同志们,看来你们用DOS的时间太少了,<br>完全是基本概念不清楚啊<br><br>呵呵!本人对DOS了解得的确不多,所以有些贻笑大方了!<br>关于这个问题,我是这样理解的,subst映射后应该会在某个地方有标记,后者的话,系统自己又如何判断?<br>是一个文件,还是系统内核,还是磁道?我不大清楚,也希望有人指正!<br>这样的功能并非每人实现过,在国外一家Delphi网站有IsSubst函数提供,可惜连接已经坏了!<br>一家之言,若有不周,敬请赐教!
 
》subst与注册表无关, 也与DLL无关啊!<br>老兄,太绝对了。虽然SUBST是DOS时代的东东,但在Win环境下,这些程序是重新写的,<br>用DLL来实现也很合理,实际上MSDN里就明确地说:<br><br>ULIB.DLL &nbsp; &nbsp; &nbsp; Provides support for commands: DISKCOPY, SUBST, DOSKEY,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ACLCONV, CHCP, KEYB, CONVERT, MODE, XCOPY, REPLACE,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MORE, PRINT, RECOVER, COMP, FC, CHKDSK, FIND, TREE,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SORT, DISKCOMP, ATTRIB, FORMAT, etc.<br><br>与注册表好像是真的无关,我以各种形式在注册表里查找 SUBSTed 信息都没结果。<br><br>__________<br><br>我查了一下以前用TP5写的程序,调用DOS 60h就可以获得给定路径的真实路径:<br>function ExpandPath(Var SPath,DPath:String):Boolean;<br>&nbsp; Assembler; Asm<br>&nbsp; &nbsp; &nbsp; push ds<br>&nbsp; &nbsp; &nbsp; lds &nbsp;dx, SPath<br>&nbsp; &nbsp; &nbsp; call StrToASCZ<br>&nbsp; &nbsp; &nbsp; mov &nbsp;ah, 60h<br>&nbsp; &nbsp; &nbsp; lds &nbsp;si, SPath<br>&nbsp; &nbsp; &nbsp; les &nbsp;di, DPath<br>&nbsp; &nbsp; &nbsp; int &nbsp;21h<br>&nbsp; &nbsp; &nbsp; jc &nbsp; @@1 &nbsp;{error}<br>&nbsp; &nbsp; &nbsp; call ASCZtoStr<br>&nbsp; &nbsp; &nbsp; mov &nbsp;al, 1<br>&nbsp; &nbsp; &nbsp; jmp &nbsp;@@2<br>&nbsp; &nbsp; @@1:<br>&nbsp; &nbsp; &nbsp; mov &nbsp;al, 0<br>&nbsp; &nbsp; @@2:<br>&nbsp; &nbsp; &nbsp; pop &nbsp;ds<br>&nbsp; end;{ExpandPath}<br>但我不知道现在的汇编怎么个写法,哪位仁兄可否搞整过来试一试。<br><br>_________<br><br>MSDN介绍71AA 00-02 三个功能是专门处理 SUBST 的,但都是实模式的汇编:<br><br>mov ax, 71aah &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; SUBST<br>mov bh, 2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; Query SUBST<br>mov bl, DriveNum &nbsp; &nbsp; &nbsp; &nbsp; ; see below<br>mov dx, seg PathName &nbsp; &nbsp; ; see below<br>mov ds, dx<br>mov dx, offset PathName <br>int 21h<br><br>jc error<br><br>还有7160的三个功能也与SUBST有关。<br><br>
 
你在DOS下试试,直接输入SUBST就能得到它所映射的盘符和相对的盘符,只要你知道怎么得到<br>DOS下的命令输出就能解决这个问题.我记得前面有人提到过怎么得到DOS命令输出内容,你找<br>找看?
 
我现在是通过执行Windows的command.exe或cmd.exe调用SUBST.EXE输出重定向到一个文件,<br>然后从文件装入列表,效率很差,而且非常麻烦:<br>获取临时文件-删除临时文件-取ComSpec-执行程序-查错-等待-检查临时文件-<br>创建StringList-从文件装入-查错-重复装入-处理列表-删除临时文件-查找盘符...<br>如果要做完善,还需要创建一个线程来处理文件更新事件...<br>真TMD麻烦!
 
可以使用 QueryDosDevice API:<br>function GetSubstDrivePath(const SubstDrivName: string): string;<br>var<br>&nbsp; Buffer: array[0..MAX_PATH] of Char;<br>&nbsp; Len: Integer;<br>begin<br>&nbsp; Result := '';<br>&nbsp; Len := QueryDosDevice(PChar(SubstDrivName), Buffer, MAX_PATH);<br>&nbsp; if (Len &gt; 0) then<br>&nbsp; &nbsp; SetString(Result, Buffer, Len)<br>&nbsp; else<br>&nbsp; &nbsp; RaiseLastWin32Error;<br>end;<br><br>使用,如: ShowMessage(GetSubstDrivePath('X:'));
 
非常感谢bbkxjy!<br>这正是我所要的!<br>也谢谢各位参与!
 
后退
顶部