| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
philips Capt

Registrado: 16 Nov 2005Mensajes: 154
|
Publicado: Vie 26 Oct, 2007 1:19 pm Asunto: Averiguar el Device Name |
|
|
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 |
|
 |
philips Capt

Registrado: 16 Nov 2005Mensajes: 154
|
Publicado: Sab 27 Oct, 2007 9:12 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 29 Oct, 2007 6:59 pm Asunto: |
|
|
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 |
|
 |
philips Capt

Registrado: 16 Nov 2005Mensajes: 154
|
Publicado: Lun 29 Oct, 2007 7:15 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 29 Oct, 2007 7:20 pm Asunto: |
|
|
| ¿ Que versión de Windows y de C++Builder utilizas ? |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 29 Oct, 2007 7:28 pm Asunto: |
|
|
| 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 |
|
 |
philips Capt

Registrado: 16 Nov 2005Mensajes: 154
|
Publicado: Lun 29 Oct, 2007 8:14 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 29 Oct, 2007 8:24 pm Asunto: |
|
|
| 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 |
|
 |
philips Capt

Registrado: 16 Nov 2005Mensajes: 154
|
Publicado: Lun 29 Oct, 2007 8:56 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 29 Oct, 2007 9:41 pm Asunto: |
|
|
| 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 |
|
 |
philips Capt

Registrado: 16 Nov 2005Mensajes: 154
|
Publicado: Lun 29 Oct, 2007 10:18 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 29 Oct, 2007 11:36 pm Asunto: |
|
|
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 |
|
 |
philips Capt

Registrado: 16 Nov 2005Mensajes: 154
|
Publicado: Mar 30 Oct, 2007 12:15 am Asunto: |
|
|
Leo, me has dejado sin palabras
Simplemente maravilloso
Muchisimas gracias
Phil |
|
| Volver arriba |
|
 |
|