Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

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


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 03:26:03.


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