Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Какая буква у USB-носителя?


Автор: Alca 15.7.2009, 15:43
Есть "\\?\usb#vid_ffff&pid_001b#00000001#{a5dcbf10-6530-11d2-901f-00c04fb951ed}".
Необходимо по  этой строке вычислить на каком диске сидит флешка.

Автор: Keeper89 15.7.2009, 18:04
Вот интересная страничка: http://www.ureader.com/message/1018345.aspx, в конце есть пример на Delphi. Речь идет об извлечении USB-устройств, а соответствующие им буквы определяются в процессе для составления списка этих устройств.

З.Ы. Вот http://www.delphipraxis.net/topic142472.html страница в тему.

Автор: Alca 16.7.2009, 15:55
Я так понял, что только через реестр можно замутить?

Автор: Alca 16.7.2009, 17:09
 smile 
НЕ получается у меня через реестр...

Автор: Romikgy 16.7.2009, 19:26
Код

function GetVolumeNameForVolumeMountPointString(Name: string): string;
var
  Volume: array [0..MAX_PATH] of Char;
begin
  FillChar(Volume[0], SizeOf(Volume), 0);
  GetVolumeNameForVolumeMountPoint(PChar(Name), @Volume[0], SizeOf(Volume));
  Result := Volume;
end;


эта ф-ция важная ,
причем здесь реестр ?

Автор: Alca 16.7.2009, 20:19
А чего в эту функцию пихать надо, какой параметр?

Добавлено @ 20:26
Разобрался:
Код

#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>
//---------------------------------------------------------------------------
std::string sGetVolumeNameForVolumeMountPointString(const std::string &csStr) {
    CHAR Volume[MAX_PATH + 1] = {0};

    ::GetVolumeNameForVolumeMountPoint(csStr.c_str(), &Volume[0], MAX_PATH);
    
    return Volume;
}
//---------------------------------------------------------------------------
int main(int argc, char* argv[]) {
    std::string sRes;
    
    sRes = sGetVolumeNameForVolumeMountPointString("I:\\");
    std::cout << "sGetVolumeNameForVolumeMountPointString: " << sRes.c_str() << std::endl;
    
    system("pause");
    return 0;
}
//---------------------------------------------------------------------------



Добавлено через 12 минут и 2 секунды
И где здесь связь?
Код

Искомая строка ---> "\\?\usb#vid_058f&pid_6387#3dh5r5el#{a5dcbf10-6530-11d2-901f-00c04fb951ed}"

sGetVolumeNameForVolumeMountPointString ---> "\\?\Volume{ac78451d-3366-11de-8bb6-806d6172696f}\"

Автор: Romikgy 16.7.2009, 21:53
еще 2 ф-кции нужны оказывается 
GetDriveInstanceID(DriveMountPoints[I], Inst);
    SymbolicName := GetSymbolicName(Inst);
эти 

Автор: Alca 16.7.2009, 22:02
Код

GetDriveInstanceID(DriveMountPoints[I], Inst);
GetSymbolicName(Inst);

Таких я в MSDN не нашел...   smile 

Автор: Alca 16.7.2009, 23:18
 smile 
Код

function GetFlashSerialFromDrive(const Drive:string):string;
const
  GUID_DEVINTERFACE_VOLUME:TGUID='{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}';
var
  PnPHandle:HDEVINFO;
  DevData:TSPDevInfoData;
  DeviceInterfaceData:TSPDeviceInterfaceData;
  FunctionClassDeviceData:PSPDeviceInterfaceDetailData;
  Devn:Integer;
  BytesReturned:DWORD;
  Inst:DEVINST;
  MountPointName:string;
  Key:HKEY;
  Buffer:array[0..4095] of Char;
  function GetVolumeNameForVolumeMountPointString(const Name:string):string;
  var
    Volume:array[0..MAX_PATH] of Char;
  begin
    FillChar(Volume[0],SizeOf(Volume),0);
    GetVolumeNameForVolumeMountPoint(PChar(Name),@Volume[0],SizeOf(Volume));
    Result:=Volume;
  end;
  function ExtractSerial(const SymbolicName:string):string;
  var
    Count:DWORD;
    PC,First:PChar;
  begin
    PC:=PChar(SymbolicName);
    Count:=0;
    First:=nil;
    while PC^<>#0 do begin
      if PC^='#' then begin
        case Count of
          1:First:=PC+1;
          2:begin
              SetString(Result,First,PC-First);
              Exit;
            end;
        end;
        Inc(Count);
      end;
      Inc(PC);
    end;
    Result:='';
  end;
begin
  Result:='';
  PnPHandle:=SetupDiGetClassDevs(@GUID_DEVINTERFACE_VOLUME,nil,0,DIGCF_PRESENT or DIGCF_DEVICEINTERFACE);
  if PnPHandle<>Pointer(INVALID_HANDLE_VALUE) then ;
  try
    MountPointName:=GetVolumeNameForVolumeMountPointString(Drive);
    DeviceInterfaceData.cbSize:=SizeOf(TSPDeviceInterfaceData);
    Devn:=0;
    while SetupDiEnumDeviceInterfaces(PnPHandle,nil,GUID_DEVINTERFACE_VOLUME,Devn,DeviceInterfaceData) do begin
      DevData.cbSize:=SizeOf(DevData);
      BytesReturned:=0;
      SetupDiGetDeviceInterfaceDetail(PnPHandle,@DeviceInterfaceData,nil,0,BytesReturned,@DevData);
      if (BytesReturned<>0)and(GetLastError=ERROR_INSUFFICIENT_BUFFER) then begin
        FunctionClassDeviceData:=AllocMem(BytesReturned);
        try
          FunctionClassDeviceData.cbSize:=SizeOf(TSPDeviceInterfaceDetailData);
          if SetupDiGetDeviceInterfaceDetail(PnPHandle,@DeviceInterfaceData,FunctionClassDeviceData,BytesReturned,BytesReturned,@DevData) then begin
            if GetVolumeNameForVolumeMountPointString(PChar(@FunctionClassDeviceData.DevicePath)+'\')=MountPointName then begin
              Inst:=DevData.DevInst;
              CM_Get_Parent(Inst,Inst,0);
              CM_Get_Parent(Inst,Inst,0);
              CM_Open_DevNode_Key(Inst,KEY_READ,0,REGDISPOSITION(RegDisposition_OpenExisting),Key,0);
              Buffer[0]:=#0;
              if Key<>INVALID_HANDLE_VALUE then begin
                BytesReturned:=SizeOf(Buffer);
                if RegQueryValueEx(Key,'SymbolicName',nil,nil,@Buffer[0],@BytesReturned)=0 then begin
                  Result:=ExtractSerial(Buffer);
                  if Pos('&',Result)>0 then Result:='';
                end;
                RegCloseKey(Key);
              end;
              Exit;
            end;
          end;
        finally
          FreeMem(FunctionClassDeviceData);
        end;
      end;
      Inc(Devn);
    end;
  finally
    SetupDiDestroyDeviceInfoList(PnPHandle);
  end;
end;

Автор: Romikgy 16.7.2009, 23:30
это не в msdn это в тех ссылках что выше ....

Автор: Alca 17.7.2009, 09:09
Romikgy, я уже вкурил

Автор: Romikgy 17.7.2009, 11:40
молодца , не дыми сильно только

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)