| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Atacaite Ens

Registrado: 28 Oct 2003Mensajes: 26Ubicación: Gran Canaria
|
Publicado: Lun 03 Nov, 2003 11:18 am Asunto: Ventana de Entorno de Red |
|
|
Hola a todos. El problema que tengo es que no se sacar la ventana de entorno de red, la que aparece en la imagen de abajo, para poder seleccionar una maquina de la red. He tenido que hacer una chapuza para hacer esto que ha sido sacar la ventana de seleccionar un fichero que por ahi si se puede acceder al entorno de red, y del string que me devuelde sacar el nombre de la maquina, pero supongo yo que consiguiendo sacar esta ventana te devolvera el nombre de la maquina directamente.
¿Alguien que lo haya usado me puede decir como puedo sacar esta venta y como se usa?
Otra pregunta al respecto, ¿habria alguna forma de hacer con esta ventana una especie de filtro y que solo muestre las maquinas que tienen corriendo una determinada aplicacion?
Muchas gracias de antemano por la ayuda. Saludos
 |
|
| Volver arriba |
|
 |
ikis Master


Registrado: 28 Dic 2002Mensajes: 703Ubicación: Madrid, España
|
Publicado: Lun 03 Nov, 2003 3:17 pm Asunto: |
|
|
| Cita: | | Otra pregunta al respecto, ¿habria alguna forma de hacer con esta ventana una especie de filtro y que solo muestre las maquinas que tienen corriendo una determinada aplicacion? |
esto lo podrías hacer pero comunicando a las computadoras en cuestión utilizando sockets, o bien se me ocurre que podrías hacer que todas escriban su estado en una base de datos o archivo de registro central. |
|
| Volver arriba |
|
 |
Invitado
|
Publicado: Lun 03 Nov, 2003 3:27 pm Asunto: |
|
|
Me parece una buena solucion, pero yo pienso que debe haber una forma mas sencilla de hacerlo. Un ejemplo de lo que intento hacer se ve por ejemplo en un cliente de Terminal Server. Cuando habres el cliente te dice los servidores de Terminal Server que hay en ese momento activos en tu red.
El caso es que estoy haciendo una aplicacion Cliente / Servidor, utilizando la interfaz de DCom, y el problema aparece cuando el Cliente no esta configurado y no tiene ningun servidor asociado. Por eso quiero conseguir sacar esta ventana de buscar equipo que tiene el windows, y si ya ademas me filtrara solo las equipos que tengan corriendo la aplicacion servidor ya seria la bomba.
Yo me imagino que sera alguna API de windows lo que haya que utilizar, por que el Builder no tiene ningun componente que haga esto, o por lo menos yo no lo he encontrado y mira que lo he buscado. He intentado encontrar informacion sobre esto por internet y tampoco he dado con nada. Por eso he puesto la consulta aqui, a ver si algun colega se ha encontrado con el mismo problema y me hecha una mano  |
|
| Volver arriba |
|
 |
Atacaite Ens

Registrado: 28 Oct 2003Mensajes: 26Ubicación: Gran Canaria
|
Publicado: Lun 03 Nov, 2003 3:28 pm Asunto: |
|
|
ops el mensaje de arriba es mio. Se me olvido Loginearme  |
|
| Volver arriba |
|
 |
Atacaite Ens

Registrado: 28 Oct 2003Mensajes: 26Ubicación: Gran Canaria
|
Publicado: Lun 03 Nov, 2003 4:09 pm Asunto: |
|
|
He encontrado este codigo, pero esta en Visual Basic creo. ¿Se podria adaptar para utilizarlo con el Builder alguien que este mas puesto con esto?
Seleccionar equipos y carpetas de una red Windows
Este código muestra un cuadro de dialogo para poder seleccionar sólo un equipo de la red o para seleccionar una carpeta concreta de un equipo que este conectado a la red.
Para ejecutar este ejemplo debes añadir al nuevo proyecto dos botones (Command1 y Command2) y dos textbox (Text1 y Text2).
Option Explicit
Private Const ERROR_SUCCESS As Long = 0
Private Const MAX_PATH As Long = 260
Private Const CSIDL_NETWORK As Long = &H12
Private Const BIF_RETURNONLYFSDIRS As Long = &H1
Private Const BIF_BROWSEFORCOMPUTER As Long = &H1000
Private Type BROWSEINFO
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" _
Alias "SHGetPathFromIDListA" _
(ByVal pidl As Long, _
ByVal pszPath As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32.dll" _
Alias "SHBrowseForFolderA" _
(lpBrowseInfo As BROWSEINFO) As Long
Private Declare Function SHGetSpecialFolderLocation _
Lib "shell32.dll" _
(ByVal hwndOwner As Long, _
ByVal nFolder As Long, _
pidl As Long) As Long
Private Declare Sub CoTaskMemFree Lib "ole32.dll" _
(ByVal pv As Long)
Private Sub Command1_Click()
Text1.Text = GetBrowseNetworkWorkstation()
End Sub
Private Sub Command2_Click()
Text2.Text = GetBrowseNetworkShare()
End Sub
Private Function GetBrowseNetworkShare() As String
'returns only a valid share on a
'network server or workstation
Dim BI As BROWSEINFO
Dim pidl As Long
Dim sPath As String
Dim pos As Integer
'obtain the pidl to the special folder ##!##network##!##
If SHGetSpecialFolderLocation(Me.hWnd, _
CSIDL_NETWORK, _
pidl) = ERROR_SUCCESS Then
'fill in the required members, limiting the
'Browse to the network by specifying the
'returned pidl as pidlRoot
With BI
.hOwner = Me.hWnd
.pidlRoot = pidl
.pszDisplayName = Space$(MAX_PATH)
.lpszTitle = "Select a network computer or share."
.ulFlags = BIF_RETURNONLYFSDIRS
End With
'show the browse dialog
pidl = SHBrowseForFolder(BI)
If pidl <> 0 Then
'got a pidl .. but is it valid?
sPath = Space$(MAX_PATH)
If SHGetPathFromIDList(ByVal pidl, ByVal sPath) Then
'valid, so get the share path
pos = InStr(sPath, Chr$(0))
GetBrowseNetworkShare = Left$(sPath, pos - 1)
End If
Call CoTaskMemFree(pidl)
Else:
'a server selected...follow same principle
'as in GetBrowseNetworkWorkstation
GetBrowseNetworkShare = "\" & BI.pszDisplayName
End If 'If pidl
End If 'If SHGetSpecialFolderLocation
End Function
Private Function GetBrowseNetworkWorkstation() As String
'returns only a valid network server or
'workstation (does not display the shares)
Dim BI As BROWSEINFO
Dim pidl As Long
Dim sPath As String
Dim pos As Integer
'obtain the pidl to the special folder ##!##network##!##
If SHGetSpecialFolderLocation(Me.hWnd, _
CSIDL_NETWORK, _
pidl) = ERROR_SUCCESS Then
'fill in the required members, limiting the
'Browse to the network by specifying the
'returned pidl as pidlRoot
With BI
.hOwner = Me.hWnd
.pidlRoot = pidl
.pszDisplayName = Space$(MAX_PATH)
.lpszTitle = "Select a network computer."
.ulFlags = BIF_BROWSEFORCOMPUTER
End With
'show the browse dialog. We don##!##t need
'a pidl, so it can be used in the If..then directly.
If SHBrowseForFolder(BI) <> 0 Then
'a server was selected. Although a valid pidl
'is returned, SHGetPathFromIDList only return
'paths to valid file system objects, of which
'a networked machine is not. However, the
'BROWSEINFO displayname member does contain
'the selected item, which we return
GetBrowseNetworkWorkstation = "\" & BI.pszDisplayName
End If 'If SHBrowseForFolder
Call CoTaskMemFree(pidl)
End If 'If SHGetSpecialFolderLocation
End Function |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Lun 03 Nov, 2003 4:53 pm Asunto: |
|
|
Si deseas abrir el cuado conexion de red, este es el codigo ponlo en un boton, y luego realiza lo siguiente
| Código: |
void __fastcall TFNet::Button3Click(TObject *Sender)
{
// para abrir el cuadro de dialogo, "conectar a una unidad de red"
WNetConnectionDialog(Application->Handle,1);
DriveComboBox1->TextCase= DriveComboBox1->TextCase; // para refrescar la unidad en un driveCombo
}
|
despues de eso como esta funcion no tiene refresh, es decir te conectas, pero en tu apliacion no tiene no ves la unidad donde te acabas de conectar, en el componente realiza lo siguiente...
| Código: |
DriveComboBox1->TextCase= DriveComboBox1->TextCase; // para refrescar la unidad en un driveCombo
|
en la segunda linea de codigo, te dice como hacer el refresh, para que tengsa nuevamente, la unidad, donde te acabas de conectar _________________
 |
|
| Volver arriba |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Lun 03 Nov, 2003 6:40 pm Asunto: |
|
|
Blasfemaron al poner codigo de Visual Suck..jejejee.. _________________ Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc
http://www.touchsoftwares.com |
|
| Volver arriba |
|
 |
Atacaite Ens

Registrado: 28 Oct 2003Mensajes: 26Ubicación: Gran Canaria
|
Publicado: Lun 03 Nov, 2003 7:19 pm Asunto: |
|
|
| jejeje es q es lo que quiero pero no aparece en el jodido Builder |
|
| Volver arriba |
|
 |
Atacaite Ens

Registrado: 28 Oct 2003Mensajes: 26Ubicación: Gran Canaria
|
Publicado: Lun 03 Nov, 2003 7:21 pm Asunto: |
|
|
Gracias César por la info. No es exactamente la ventana que quiero. La que quiero es la que aparece en el dibujito de arriba, y esa debe tener otra API por ahi escondida . Ya casi esta rodeada. Llevo todo el dia buscandola pero no aparece la jodida  |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 03 Nov, 2003 9:28 pm Asunto: |
|
|
Siempre que se pegue código y sobretodo si es algo largo estaría bien que estuviese minimamente indentado, ya que sino se hace mas pesado seguirlo...
Bueno, aquí va una traducción lo mas literal posible quitando los comentarios y los malabarismos que hacen los de VB cada vez que usan el API
Tienes que añadir: #include <shlobj.h>
y para que no te de ningún error es importantísimo que añadas NO_WIN32_LEAN_AND_MEAN en las propiedades del proyecto en la pestaña 'Directories/Conditionals' en el edit que pone 'Conditional defines:'
o bien si te parece mas simple añade las dos siguientes líneas al principio del todo, por encima de #include <vcl.h>
#define NO_WIN32_LEAN_AND_MEAN
#include <shlobj.h>
....
| Código: | String GetBrowseNetworkShare()
{
BROWSEINFO bi = {0};
LPITEMIDLIST pidl;
char szPath[MAX_PATH];
String ret = "";
if (SHGetSpecialFolderLocation(Form1->Handle, CSIDL_NETWORK, &pidl)
== ERROR_SUCCESS)
{
bi.hwndOwner = Form1->Handle;
bi.pidlRoot = pidl;
bi.lpszTitle = "Select a network computer or share.";
bi.ulFlags = BIF_RETURNONLYFSDIRS;
pidl = SHBrowseForFolder(&bi);
if (pidl)
{
if (SHGetPathFromIDList(pidl, szPath))
ret = szPath;
CoTaskMemFree(pidl);
}
else
ret = String("\\") + bi.pszDisplayName;
}
return ret;
} |
| Código: | String GetBrowseNetworkWorkstation()
{
BROWSEINFO bi = {0};
LPITEMIDLIST pidl;
char szPath[MAX_PATH];
String ret = "";
if (SHGetSpecialFolderLocation(Form1->Handle, CSIDL_NETWORK, &pidl)
== ERROR_SUCCESS)
{
bi.hwndOwner = Form1->Handle;
bi.pidlRoot = pidl;
bi.lpszTitle = "Select a network computer.";
bi.ulFlags = BIF_BROWSEFORCOMPUTER;
if (SHBrowseForFolder(&bi))
ret = String("\\") + bi.pszDisplayName;
CoTaskMemFree(pidl);
}
return ret;
} |
|
|
| Volver arriba |
|
 |
Atacaite Ens

Registrado: 28 Oct 2003Mensajes: 26Ubicación: Gran Canaria
|
Publicado: Lun 03 Nov, 2003 11:36 pm Asunto: |
|
|
Muchas gracias Leo. Me ha funcionado a la perfeccion. Era justo lo que buscaba
Siento no haberte indentado el codigo, perdona mis novatadas de primerizo en el foro
Muchas Gracias y Salu2. |
|
| Volver arriba |
|
 |
Atacaite Ens

Registrado: 28 Oct 2003Mensajes: 26Ubicación: Gran Canaria
|
Publicado: Lun 03 Nov, 2003 11:37 pm Asunto: |
|
|
Por cierto Leo, somos casi vecinos, yo soy de Gran Canaria  |
|
| Volver arriba |
|
 |
|