Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-10-2006
Boris Boris is offline
Miembro
 
Registrado: may 2006
Posts: 11
Poder: 0
Boris Va por buen camino
Smile Utilizar DeviceIoControl

Buenas, Alguien podría ayudarme a utilizar ésta rutina para obtener el número de serie (físico) de un dispositivo usb??, no soy un experto y me es difícil poder utilizarlo.
Responder Con Cita
  #2  
Antiguo 10-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Estuve probando con la función DeviceIOControl para obtener el numero de serie de una memoria USB y tengo problemas para conseguirlo.

Por ejemplo, usando IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER
Código Delphi [-]
const
  METHOD_BUFFERED = 0;
  FILE_ANY_ACCESS = 0;
  FILE_DEVICE_MASS_STORAGE = $2D;
  IOCTL_STORAGE_BASE = FILE_DEVICE_MASS_STORAGE;

  IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER =
    (IOCTL_STORAGE_BASE shl 16) or
    ($304 shl 2) or
    METHOD_BUFFERED or
    (FILE_ANY_ACCESS shl 14);

type
  TMEDIA_SERIAL_NUMBER_DATA = packed record
    SerialNumberLength: ULONG;
    Result: ULONG;
    Reserved: array[1..2] of ULONG;
    SerialNumberData: array[0..0] of Char;
  end;
  PMEDIA_SERIAL_NUMBER_DATA = ^TMEDIA_SERIAL_NUMBER_DATA;

function SerialNumber(Letra: Char): string;
var
  Disk: THandle;
  SerialNumberData: TMEDIA_SERIAL_NUMBER_DATA;
  BytesReturned: Cardinal;
begin
  Result:= EmptyStr;
  if GetDriveType(PChar(Letra + ':\')) = DRIVE_REMOVABLE then
  begin
    Disk:= CreateFile(PChar('\\.\' + Letra + ':'),GENERIC_READ,FILE_SHARE_READ,nil,
      OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    if Disk <> INVALID_HANDLE_VALUE then
    begin
      FillChar(SerialNumberData,Sizeof(SerialNumberData),0);
      if DeviceIOControl(Disk,IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER,nil,0,
        @SerialNumberData,Sizeof(SerialNumberData),BytesReturned, nil) then
      begin
        ShowMessage('Correcto');
      end else ShowMessage(SysErrorMessage(GetLastError));
      CloseHandle(Disk);
    end else ShowMessage(SysErrorMessage(GetLastError));
  end;
end;

Siempre obtengo el error, de que esta operación no es aplicable a este dispositivo. Y usando IOCTL_STORAGE_QUERY_PROPERTY, que también se usa en el caso de los discos duros, solo consigo obtener un breve descripción del dispositivo ningún numero de serie o identificador único. He leído un poco por ahí y parece que algunas memorias dan problemas con estas funciones, yo probé con las 2 que tengo y el problema continua.

De todas formas, ¿para que necesitas el numero de serie? ¿podría servirte leerlo del registro de windows?

Última edición por seoane fecha: 10-10-2006 a las 12:57:24.
Responder Con Cita
  #3  
Antiguo 11-10-2006
Boris Boris is offline
Miembro
 
Registrado: may 2006
Posts: 11
Poder: 0
Boris Va por buen camino
Smile Utilizar DeviceIoControl

Muchas gracias por responder Seoane, el problema que tengo es que necesito obtener el número de serie a partir de la letra de la unidad (o viceversa).

Windows registra las series de las usbs conectadas en el orden en que se insertan, y bueno he sacado las series del registro para manejarlas paralelamente a las letras pero el problema que tengo es que las letras de las unidades no cambian y las series pueden estar en cualquier orden dependiendo como se insertan así que no coinciden (no hacen match).

Si se pudiera obtener las series a partir de la letra o al revés, por medio del registro de windows sería muy muy bueno jeje. Agradezco mucho tu ayuda Seoane. Gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Utilizar La Web Cam jostrix Varios 5 29-05-2005 15:03:13
Utilizar cámara web mamaro Gráficos 1 21-03-2005 11:31:13
Utilizar Webs jymy788 Varios 0 10-11-2004 18:17:23
utilizar LIKE en consulta fjolivares Firebird e Interbase 2 08-11-2004 19:53:46
Como utilizar un DCR y PAS andrestsas Varios 1 26-10-2003 19:31:58


La franja horaria es GMT +2. Ahora son las 15:34:47.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi