Use Delphi to Find Special Drives

前端 未结 2 1275
不思量自难忘°
不思量自难忘° 2020-12-21 03:30

I am trying to write a small program in Delphi 2007 to access files off of a portable USB drive whenever it is plugged in to a Windows 7 machine. This drive does not show u

相关标签:
2条回答
  • 2020-12-21 04:16

    You more than likely aren't initializing COM correctly. Your code will work as-is if you don't call CoInitializeEx or if you call it with a bad value, but the Portable Device drivers require apartment threading to work.

    Based on your code, here's a sample app that works correctly and shows portable devices. If you comment out the CoInitializeEx/CoUninitialize calls or pass in COINIT_MULTITHREADED instead it will still work, but it only shows the drives.

    program ListMyComputer;
    
    {$APPTYPE CONSOLE}
    
    uses
      ComObj, ShlObj, ShellApi, ShLwApi, ActiveX, Windows, SysUtils;
    
    var
      Enum: IEnumIDList;
      Fetched: Longword;
      CompPidl, Item: PItemIDList;
      Path: PWideChar;
      Desktop, Computer: IShellFolder;
      StrRet: TSTRRET;
    begin
      CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
      try
        WriteLn('Computer changed...  Checking folders.');
        SHGetDesktopFolder(Desktop);
        SHGetFolderLocation(0, CSIDL_DRIVES, 0, 0, CompPidl);
        Desktop.BindToObject(CompPidl, Nil, IID_IShellFolder, Computer);
        CoTaskMemFree(CompPidl);
        If Assigned(Computer) And
           (Computer.EnumObjects(0, SHCONTF_FOLDERS, Enum) = NOERROR) Then
        Begin
          While (Enum.Next(1, Item, Fetched) = NOERROR) Do
          Begin
            FillChar(StrRet, SizeOf(StrRet), #0);
            Computer.GetDisplayNameOf(Item, SHGDN_FORADDRESSBAR or SHGDN_NORMAL, StrRet);
            StrRetToStr(@StrRet, Item, Path);
            WriteLn(Path);
            CoTaskMemFree(Path);
          End;
        End;
        WriteLn('Enumeration complete');
        ReadLn;
      finally
        CoUninitialize
      end;
    end.
    
    0 讨论(0)
  • 2020-12-21 04:21

    Thanks to @SertacAkyuz for pointing out the need to use Windows Portable Device API which lead me to this Experts Exchange question discussing the same thing. Sinisa Vuk supplied an awesome code example to answer that question which I have linked (it's too long to embed) here with permission: http://pastebin.com/0hSWv5pE

    0 讨论(0)
提交回复
热议问题