Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Averiguar el Device Name

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Averiguar el Device Name Responder citando

Hace tiempo en este mismo foro César puso un buen ejemplo de como detectar la conexión de dispositivos al Pc

Era una función llamada WMCambioEnDispositivo, que funciona de maravilla

El caso es que necesito hacer una función para averigual el nombre de los discos duros y puertos serie virtuales conectados al PC y agradeceria una orientación de como hacerlo

He estado buscando en el foro y no encuentro nada que me encaje

Saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Quizás no me haya explicado bien

Si por ejemplo tengo un disco duro con la etiqueta "MIDISCODURO" y un puerto serie generado por un FTDI conectado al USB del PC llamado "MI_FTDI" , necesito saber como poder leer desde mi programa la etiqueta del disco duro y el nombre o ID del FTDI cuyo nombre es "MI_FTDI"

Por favor César, Leo u otro maestro hecharme una manita

Saludos

Phil
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Para listar los puertos y sus nombres podrías usar por ejemplo la función del API "EnumPorts". Un ejemplo:
Código:
DWORD cbNeeded = 0;
DWORD cReturned = 0;
EnumPorts(0, 2, 0, 0, &cbNeeded, &cReturned);
std::vector<BYTE> buffer(cbNeeded+1);  // #include<vector>
bool ret = EnumPorts(0, 2, &buffer[0], cbNeeded, &cbNeeded, &cReturned);
if (ret) {
    PORT_INFO_2* ports = reinterpret_cast<PORT_INFO_2*>(&buffer[0]);
    String str = "";
    for (DWORD i = 0; i < cReturned; i++) {
        str += String().sprintf("%s (%s)\n",
            ports[i].pPortName, ports[i].pDescription);
    }
    ShowMessage(str);
}


Y para listar y extraer las etiquetas de todas las unidades podrías usar las funciones "GetLogicalDriveStrings" y "GetVolumeInformation" respectivamente:
Código:
int size = GetLogicalDriveStrings(0, 0);
std::vector<char> buffer(size+1);  // #include<vector>
GetLogicalDriveStrings(size, &buffer[0]);
String str = "";
char* drive = &buffer[0];
while (*drive) {
    char etiq[256] = "";
    GetVolumeInformation(drive, etiq, sizeof(etiq)-1, 0, 0 ,0 ,0 ,0);
    str += String().sprintf("%s [%s]\n", drive, etiq);
    drive += strlen(drive) + 1;
}
ShowMessage(str);
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias Leo

Recibo un error diciendo que no se ha encontrado "WinspoolDll"
Quizás algun archivo que he de importar?

He incluido en la cabecera el #include<vector>
Gracias de nuevo

Phil
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

¿ Que versión de Windows y de C++Builder utilizas ?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Acabo de probarlo en Windows 95 y 98 con el BCB4 y me funciona, solo he tenido que añadir la cabecera "winspool.h". Anteriormente lo había probado en Windows XP con el BCB6 y no fue necesario agregar "winspool.h".
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Estoy usado Borland Developer Studio 2006 en Windows XP

he añadido en la cabecera #include "winspool.h" y recibo estos errores

[C++ Error] Unit1.cpp(67839): E2316 'vector' is not a member of 'std'
[C++ Error] Unit1.cpp(67839): E2108 Improper use of typedef 'BYTE'
[C++ Error] Unit1.cpp(67839): E2268 Call to undefined function 'buffer'
[C++ Error] Unit1.cpp(67840): E2453 Size of the type 'int(...)' is unknown or zero
[C++ Error] Unit1.cpp(67840): E2034 Cannot convert 'int (*)(...)' to 'unsigned char *'
[C++ Error] Unit1.cpp(67840): E2342 Type mismatch in parameter 'pPorts' (wanted 'unsigned char *', got 'int (*)(...)')
[C++ Error] Unit1.cpp(67842): E2453 Size of the type 'int(...)' is unknown or zero


He añádido solo este codigo


DWORD cbNeeded = 0;
DWORD cReturned = 0;
EnumPorts(0, 2, 0, 0, &cbNeeded, &cReturned);
std::vector<BYTE> buffer(cbNeeded+1); // #include<vector>
bool ret = EnumPorts(0, 2, &buffer[0], cbNeeded, &cbNeeded, &cReturned);
if (ret) {
PORT_INFO_2* ports = reinterpret_cast<PORT_INFO_2>(&buffer[0]);
String str = "";
for (DWORD i = 0; i < cReturned; i++) {
str += String().sprintf("%s (%s)\n",
ports[i].pPortName, ports[i].pDescription);
}
ShowMessage(str);
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Has hecho una prueba sencilla de crear un proyecto nuevo, añadir un botón y en el OnClick del mismo ese código? (además de las cabeceras <vector> y <winspool.h>)
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Me he bajado la dll "winspool.dll", la he colocado en C:\windows\system32 y ha funcionado

Al ejecutarlo me aparece un listado de puertos que hay en el PC del tipo:

COM1: (puerto local)
COM2: (puerto local)
COM3: (puerto local)
etc

En COM3 tengo un Com virtual generado por un Ftdi y en COM4 otro com virtual de mi móvil cuyo nombre no aparece
Solo me aparece en todos "puerto local"
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

philips escribió:
Me he bajado la dll "winspool.dll", la he colocado en C:\windows\system32 y ha funcionado

No he tenido que instalar nada extra en ninguna de las tres versiones de Windows en las que lo he probado.

philips escribió:
En COM3 tengo un Com virtual

Puedes probar cambiando lo que está dentro del "for" por la línea siguiente, para ver si alguno de los otros dos datos que da la función te ayudan a diferenciar esos puertos del resto:
Código:
        str += String().sprintf("%s (%s) (%s) (%X)\n",
            ports[i].pPortName, ports[i].pDescription,
            ports[i].pMonitorName, ports[i].fPortType);


En caso de que encuentre alguna forma de diferenciar esos puertos ya lo pongo por aquí.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

He probado esta ultima modificación, pero sigue sin dar el nombre del puerto

Muchisimas gracias Leo y perdon por las molestias

Phil
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

En el siguiente artículo hay un ejemplo que extrae los nombres del registro:

[Another serial port enumerator]
http://www.codeproject.com/system/listports.asp

Solo tendrías que descargarte el código de ese artículo, añadir el archivo "listports.c" a tu proyecto (MENU:Project>Add to Project...). Añadir la cabecera: #include<listports.h>. Luego la siguiente función, la cual se va llamando por cada puerto que encuentra con la información para que la uses como sea necesario:
Código:
static BOOL CALLBACK callback(LPVOID lpCallbackValue,
    LISTPORTS_PORTINFO* lpPortInfo)
{
    String& str = *static_cast<String*>(lpCallbackValue);
    str += String().sprintf("%s  /  %s  /  %s\n",
        lpPortInfo->lpPortName, lpPortInfo->lpFriendlyName,
        lpPortInfo->lpTechnology);
    return TRUE;
}

Y luego en el OnClick de un botón:
Código:
String str = "[PortName  /  FriendlyName  /  Technology]\n\n";
ListPorts(callback, &str);
ShowMessage(str);


En el siguiente enlace te he puesto el proyecto de ejemplo con el ejecutable incluido por si quieres ver el resultado antes de usarlo y ver si los nombres que devuelve te sirven:

http://www.telefonica.net/web/ljfg/temp/puertos_serie.zip
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Leo, me has dejado sin palabras

Simplemente maravilloso

Muchisimas gracias

Phil
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.