Ir al contenido


Foto

[RESUELTO] Asignar o configurar la Configuración LAN de Internet Explorer desde Delphi


  • Por favor identifícate para responder
19 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 09 octubre 2009 - 12:51

Pos eso, quisiera configurar la configuración LAN de Internet Explorer desde Delphi, más específicamente el Servidor Proxy, lo que quiero es activar la conección por servidor proxy y asignarle el nombre y puerto desde Delphi, estuve viendo la API InternetSetOption conjunatmente con la Opción INTERNET_OPTION_PROXY pero no logro saber cómo implementarlo, ¿o alguien sabe alguna otra manera? *-) *-)

Saludos.
  • 0

#2 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 09 octubre 2009 - 01:49

Yo utilizo lo siguiente para consultar sitios a través del proxy corporativo (squid).

Coloca un memo en un formulario y un botón y usa este código amigo



delphi
  1. Function ObtenHtml(hReq:  HINTERNET; Var PStlHtmlResult: TStringList): Boolean;
  2. Var
  3.   LMstDestino: TMemoryStream; //Bufer dobnde se almacenarà el conetnido devuelto por el script de actualizaciòn
  4.   LBuff:    PByte; //Define la posiciòn que està copiando
  5. LCopiado: DWORD; //Almacena el tamaño de bloque por copiar.
  6. Begin
  7.   Result := False;
  8.   Try
  9.     //FrmCarga.ArchivosLog('Obteniendo el còdigo html del recurso');
  10.     LMstDestino := TMemoryStream.Create;
  11.     LBuff := AllocMem(GBUFF_SIZE);
  12.     Try
  13.       LCopiado := 1;
  14.     While LCopiado > 0 do
  15.         Begin
  16.           InternetReadFile(hReq, LBuff, GBUFF_SIZE, LCopiado);
  17.           If LCopiado > 0 then
  18.             LMstDestino.WriteBuffer(LBuff^, LCopiado);
  19.         End;
  20.       // almacenar el caracter #0 terminador
  21.       LBuff^ := 0;
  22.       LMstDestino.WriteBuffer(LBuff, 1);
  23.       Result := true;
  24.     Finally
  25.       FreeMem(LBuff, GBUFF_SIZE);
  26.       PStlHtmlResult.SetText(PChar(LMstDestino.Memory));
  27.       LMstDestino.Free;
  28.     End;
  29.   Except
  30.     On Err: Exception do
  31.       ShowMessage('Error al establecer la comunicaciòn con el servidor Web. Error: ' + Err.Message);
  32.   End;
  33. End;
  34.  
  35.  
  36.  
  37. //Ejecuta el script php de actualizaciòn de tablas en el sitio de la tienda virtual
  38. Procedure EjecutaActualizacionSitioWeb;
  39. Var
  40.   LSstrusername: String; //Define el usuario con que se validarà la conexiòn al proxy
  41.   LSstruserpass: String; //Define el usuario con que se validarà la conexiòn al proxy
  42.   LhInetInst: HINTERNET; //Almacena la instancia creada de la api WinInet
  43.   LhInetConn: HINTERNET; //Almancena el handle de la conexiòn
  44.   LhInetReq:  HINTERNET; //Almacena el handle de las peticiones
  45.   LDWData:  DWORD;      //variable que obtiene la repsuesta del servidor
  46.   LCrdTam:  Cardinal;  //Almacena el tamaño en bytes que utiliza la variable LdwData
  47.   LCrdPdwRes:  Cardinal; //Define los indices de la cabecera devuelta por el servidor web
  48.   LStlHtmlResult: TStringList; //Almacena la respuesta devuelta por el script de actualizaciòn
  49.   LSDirProxy : String; //Alamacena la direccion del proxy
  50.   LSDirLocal :String ; //Almacena las direcciones locales
  51.   LSUserSite : String ; //Almacena usuario del sitio
  52.   LSPasSite  : String; //Almacena pasword del sitio
  53.  
  54. Procedure Terminar;
  55. Begin
  56.   Try
  57.     if LhInetConn <> nil then
  58.     InternetCloseHandle(LhInetConn);
  59.   if LhInetReq <> nil then
  60.     InternetCloseHandle(LhInetReq);
  61.   if LhInetInst <> nil then
  62.     InternetCloseHandle(LhInetInst);
  63.     Screen.cursor := crDefault;
  64.   Except
  65.     On Err: Exception do
  66.       ShowMessage(&#39;Error al liberar los recursos WinInet. Error: &#39; + Err.Message);
  67.   End;
  68. End;
  69.  
  70. Begin
  71.   Try
  72.     LStlHtmlResult := TStringList.Create;
  73.     //Asigno la configuraciòn del proxy
  74.     LSstrusername  := &#39;edgram&#39;;
  75.     LSstruserpass  := &#39;77887788&#39;;
  76.     LSDirProxy    := &#39;192.168.1.12&#39;;
  77.     LSDirLocal    := &#39;192.168.1.12&#39;;
  78.  
  79.   LhInetConn    := nil;
  80.     LhInetReq      := nil;
  81.     LhInetInst    := InternetOpen(&#39;Descarga - Delphi&#39;,INTERNET_OPEN_TYPE_PROXY,
  82.                         Pchar(LSDirProxy),Pchar(LSDirLocal), INTERNET_FLAG_KEEP_CONNECTION);
  83.     if LhInetInst = nil then
  84.       Begin
  85.         ShowMessage(&#39;Error al generar una instancia LhInetInst&#39;);
  86.         Terminar;
  87.       End
  88.     Else
  89.       Begin
  90.         //Establesco el tipo de conexion que se harà (http en este caso)
  91.         LhInetConn := InternetConnect(LhInetInst,&#39;[url=http://www.delphiaccess.com]www.delphiaccess.com[/url]&#39;,INTERNET_DEFAULT_HTTP_PORT,
  92.                                       nil, nil,INTERNET_SERVICE_HTTP,
  93.                                       INTERNET_FLAG_KEEP_CONNECTION, 0);
  94.         if LhInetConn = nil then
  95.           Begin
  96.             ShowMessage(&#39;Error al crear la instancia LhInetConn&#39;);
  97.             Terminar
  98.           End
  99.         Else
  100.           Begin
  101.             //Realizò la conexiòn al recurzo definido por host
  102.             LhInetReq := HttpOpenRequest(LhInetConn, &#39;GET&#39;,&#39;forum/index.php?board=29.0&#39;, &#39;HTTP/1.1&#39;,nil,nil,
  103.                                         INTERNET_FLAG_KEEP_CONNECTION, 0);
  104.             if LhInetReq = nil then
  105.               Begin
  106.                 ShowMessage(&#39;Error al crear la instancia LhInetReq&#39;);
  107.                 Terminar
  108.               End
  109.             Else
  110.               Begin
  111.                 HttpSendRequest(LhInetReq, nil, 0, nil, 0);
  112.               LCrdTam := sizeof(LDWData);
  113.               LCrdPdwRes := 0;
  114.               HttpQueryInfo(LhInetReq, HTTP_QUERY_STATUS_CODE or HTTP_QUERY_FLAG_NUMBER,
  115.                               @LDWData, LCrdTam, LCrdPdwRes);
  116.                 Case LDWData Of
  117.                   HTTP_STATUS_PROXY_AUTH_REQ:
  118.                     Begin
  119.                       ShowMessage(&#39;Autorización de proxy requerida, se reintenta la conexion&#39;);
  120.                       InternetSetOption(LhInetReq,INTERNET_OPTION_PROXY_USERNAME,Pchar(LSstrusername),
  121.                                         Length(LSstrusername) + 1);
  122.                       InternetSetOption(LhInetReq,INTERNET_OPTION_PROXY_PASSWORD,Pchar(LSstruserpass),
  123.                                         Length(LSstruserpass) + 1);
  124.                       HttpSendRequest(LhInetReq, nil, 0, nil, 0);
  125.                       HttpQueryInfo(LhInetReq, HTTP_QUERY_STATUS_CODE or HTTP_QUERY_FLAG_NUMBER,
  126.                                     @LDWData, LCrdTam, LCrdPdwRes);
  127.                       If LDWData = HTTP_STATUS_PROXY_AUTH_REQ Then
  128.                         Showmessage(&#39;La autorización del servidor proxy falló&#39;)
  129.                       Else If LDWData = HTTP_STATUS_OK Then
  130.                         begin
  131.                           ObtenHtml(LhInetReq,LStlHtmlResult);
  132.                           Form1.Memo1.Lines.Text := LStlHtmlResult.Text;
  133.                         End
  134.                       Else ShowMessage(&#39;Codigo devuelto: &#39; + InttoStr(LDWData))
  135.                     End; //termina caso HTTP_STATUS_PROXY_AUTH_REQ
  136.                   HTTP_STATUS_OK: Begin
  137.                       ObtenHtml(LhInetReq,LStlHtmlResult);
  138.                       Form1.Memo1.Lines.Text := LStlHtmlResult.Text;
  139.                   End;
  140.                   Else
  141.                     ShowMessage(&#39;Codigo devuelto: &#39; + InttoStr(LDWData));
  142.                 End;//Termina case
  143.               End;
  144.           End;
  145.         End;
  146.   Except
  147.     On Err: Exception do
  148.       ShowMessage(&#39;Error al establecer la comunicaciòn con el servidor Web. Error: &#39; + Err.Message);
  149.   End;
  150.   Terminar;
  151. end;
  152.  
  153. procedure TForm1.Button1Click(Sender: TObject);
  154. begin
  155. EjecutaActualizacionSitioWeb;
  156. end;


  • 0

#3 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 09 octubre 2009 - 01:54

Creo que este código es lo que estás buscando.  ;)



cpp
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // ProxyName = "proxy.mi.empresa-data.com:8080"
  3. // ProxyOverride = "local"
  4. BOOL SetConnectionOptions(char *ProxyName, char* ProxyOverride, bool Use)
  5. {
  6.     INTERNET_PER_CONN_OPTION_LIST list;
  7.     BOOL      Result;
  8.     DWORD  dwBufSize = sizeof(list);
  9.  
  10.     // Rellenammos lo básico de la estructura list.
  11.     list.dwSize = sizeof(list);
  12.  
  13.     // NULL == LAN, en otro caso es el nombre de la conexión.
  14.     list.pszConnection = NULL;
  15.  
  16.     // Vamos a trabajar con tres opciones.
  17.     list.dwOptionCount = 3;
  18.     list.pOptions = new INTERNET_PER_CONN_OPTION[3];
  19.  
  20.     // Nos aseguramos que tenemos un puntero válido.
  21.     if( list.pOptions == NULL){
  22.         return FALSE;
  23.     }
  24.  
  25.     // flags.
  26.     list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
  27.     if(Use)
  28.       list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT | PROXY_TYPE_PROXY;
  29.     else
  30.       list.pOptions[0].Value.dwValue = 0;
  31.  
  32.     // proxy name.
  33.     list.pOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
  34.     list.pOptions[1].Value.pszValue = ProxyName;
  35.  
  36.     // proxy override.
  37.     list.pOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
  38.     list.pOptions[2].Value.pszValue = ProxyOverride;
  39.  
  40.     // options on the connection.
  41.     Result = InternetSetOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);
  42.  
  43.     // Liberamos memoria.
  44.     delete [] list.pOptions;
  45.  
  46.   // Obligamos a refrescar y notificamos el cambio al sistema... 
  47.   InternetSetOption(0, INTERNET_OPTION_REFRESH, 0, 0);
  48.   InternetSetOption(0, INTERNET_OPTION_SETTINGS_CHANGED, 0, 0);
  49.  
  50.     return Result;
  51. }



Saludos.
  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 09 octubre 2009 - 02:20

Gracias escafandra aparentemente es lo que busco, ahora mismo trataré de llevarlo a Delphi luego te comento (y).

Poliburro muchas gracias por el code, pero no es lo que busco, el problema radica en que muchas veces IE no tiene la opcion Tools->Connections la cual dificulta la configuración LAN manual. Pero de todos modos se navega ;).

Saludos
  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 09 octubre 2009 - 02:46

Al parecer INTERNET_PER_CONN_OPTION_LIST no existe en el Uses Wininet, a menos que esté en otra Uses, ¿cual es?.
  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 09 octubre 2009 - 03:28

La definición sería esta:



delphi
  1.  
  2. type
  3.   INTERNET_PER_CONN_OPTION = record
  4.   dwOption: DWORD;
  5.   Value:    DWORD;
  6.   end;
  7.   LPINTERNET_PER_CONN_OPTION = ^INTERNET_PER_CONN_OPTION;
  8.  
  9. type
  10.   INTERNET_PER_CONN_OPTION_LIST = record
  11.   dwSize:        DWORD;
  12.   pszConnection: LPTSTR;
  13.   dwOptionCount: DWORD;
  14.   dwOptionError: DWORD;
  15.   pOptions:      LPINTERNET_PER_CONN_OPTION;
  16.   end;
  17.   LPINTERNET_PER_CONN_OPTION_LIST = ^INTERNET_PER_CONN_OPTION_LIST;



Saludos.
  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 09 octubre 2009 - 03:48

Ah vale, bueno tengo lo siguiente y me han salido un reguero de errores :p :



delphi
  1. function SetConnectionOptions(ProxyName: pchar; ProxyOverride: pchar; Use: boolean): Boolean;
  2. var List: INTERNET_PER_CONN_OPTION_LIST;
  3.     dwBufSize: DWORD;
  4. begin
  5.     dwBufSize := Sizeof(List);
  6.  
  7.     // Rellenammos lo básico de la estructura list.
  8.     List.dwSize := sizeof(list);
  9.  
  10.     // NULL == LAN, en otro caso es el nombre de la conexión.
  11.     list.pszConnection := 'NULL';
  12.  
  13.     // Vamos a trabajar con tres opciones.
  14.     list.dwOptionCount := 3;
  15.     list.pOptions := INTERNET_PER_CONN_OPTION[3]; //[Error] Unit1.pas(60): '(' expected but '[' found
  16.  
  17.     // Nos aseguramos que tenemos un puntero válido.
  18.     if list.pOptions = NULL then //[Error] Unit1.pas(63): Incompatible types
  19.         Result := FALSE;
  20.  
  21.     // flags.
  22.     list.pOptions.dwOption := INTERNET_PER_CONN_FLAGS; //[Error] Unit1.pas(67): Undeclared identifier: 'INTERNET_PER_CONN_FLAGS'
  23.     if Use then
  24.       list.pOptions.Value := PROXY_TYPE_DIRECT + PROXY_TYPE_PROXY //[Error] Unit1.pas(69): Undeclared identifier: 'PROXY_TYPE_DIRECT' y el otro también
  25.     else
  26.       list.pOptions.Value := 0;
  27.  
  28.     // proxy name.
  29.     list.pOptions[1].dwOption := INTERNET_PER_CONN_PROXY_SERVER; //[Error] Unit1.pas(74): Array type required y [Error] Unit1.pas(74): Undeclared identifier: 'INTERNET_PER_CONN_PROXY_SERVER'
  30.     list.pOptions[1].Value.pszValue := ProxyName; //[Error] Unit1.pas(75): Array type required
  31.  
  32.     // proxy override.
  33.     list.pOptions[2].dwOption := INTERNET_PER_CONN_PROXY_BYPASS; //[Error] Unit1.pas(78): Undeclared identifier: 'INTERNET_PER_CONN_PROXY_BYPASS'
  34.     list.pOptions[2].Value.pszValue := ProxyOverride; //Array Type Required
  35.  
  36.     // options on the connection.
  37.     Result := InternetSetOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, ^list, dwBufSize); //[Error] Unit1.pas(82): Incompatible types: 'Variant' and 'Pointer' y [Error] Unit1.pas(82): Incompatible types: 'Char' and 'Pointer'
  38.  
  39.     //Liberamos de memoria
  40.     List.free;
  41.  
  42.     // Obligamos a refrescar y notificamos el cambio al sistema...
  43.   InternetSetOption(0, INTERNET_OPTION_REFRESH, 0, 0);
  44.   InternetSetOption(0, INTERNET_OPTION_SETTINGS_CHANGED, 0, 0);
  45.  
  46.     Result := True;
  47. end;



Ahí están todos los errores de éste simple mortal :(
  • 0

#8 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 09 octubre 2009 - 03:55

Bueno, no te preocupes. Mira a ver si esto te funciona y perdona por mi torpeza hablando delphi.



delphi
  1. type
  2.   INTERNET_PER_CONN_OPTION = record
  3.   dwOption: DWORD;
  4.   case integer of
  5.     0:(dwValue:  DWORD;);
  6.     1:(pszValue:  LPTSTR;);
  7.     2:(ftValue:  FILETIME;);
  8.   end;
  9.   LPINTERNET_PER_CONN_OPTION = ^INTERNET_PER_CONN_OPTION;
  10.  
  11. type
  12.   INTERNET_PER_CONN_OPTION_LIST = record
  13.   dwSize:        DWORD;
  14.   pszConnection: LPTSTR;
  15.   dwOptionCount: DWORD;
  16.   dwOptionError: DWORD;
  17.   pOptions: LPINTERNET_PER_CONN_OPTION;
  18.   end;
  19.   LPINTERNET_PER_CONN_OPTION_LIST = ^INTERNET_PER_CONN_OPTION_LIST;
  20.  
  21. ....
  22.  
  23. ///////////////////////////////////////////////////////////////////////////////
  24. // ProxyName = "proxy.mi.empresa-data.com:8080"
  25. // ProxyOverride = "local"
  26. function SetConnectionOptions(ProxyName: String; ProxyOverride: String; Use:bool): bool;
  27. var
  28.     list: INTERNET_PER_CONN_OPTION_LIST;
  29.     dwBufSize: DWORD;
  30.     Options: array[0..2] of INTERNET_PER_CONN_OPTION;
  31. begin
  32.     dwBufSize:= sizeof(list);
  33.  
  34.     // Rellenammos lo básico de la estructura list.
  35.     list.dwSize:= sizeof(list);
  36.  
  37.     // NULL == LAN, en otro caso es el nombre de la conexión.
  38.     list.pszConnection:= nil;
  39.  
  40.     // Vamos a trabajar con tres opciones.
  41.     list.dwOptionCount:= 3;
  42.     list.pOptions:= @(Options[0]);
  43.  
  44.     // flags.
  45.     Options[0].dwOption:= 1; //INTERNET_PER_CONN_FLAGS;
  46.     if(Use) then
  47.       Options[0].dwValue:= 1 or 2 //PROXY_TYPE_DIRECT or PROXY_TYPE_PROXY;
  48.     else
  49.       Options[0].dwValue:= 0;
  50.  
  51.     // proxy name.
  52.     Options[1].dwOption:= 2; //INTERNET_PER_CONN_PROXY_SERVER;
  53.     Options[1].pszValue:= PCHAR(ProxyName);
  54.  
  55.     // proxy override.
  56.     Options[2].dwOption:= 3; //INTERNET_PER_CONN_PROXY_BYPASS;
  57.     Options[2].pszValue:= PCHAR(ProxyOverride);
  58.     list.pOptions:= @(Options[0]);
  59.     // options on the connection.
  60.     Result:= InternetSetOption(nil, 75 {INTERNET_OPTION_PER_CONNECTION_OPTION}, @list, dwBufSize);
  61.  
  62.     // Obligamos a refrescar y notificamos el cambio al sistema...
  63.     InternetSetOption(0, INTERNET_OPTION_REFRESH, 0, 0);
  64.     InternetSetOption(0, INTERNET_OPTION_SETTINGS_CHANGED, 0, 0);
  65. end;



Usa esto como ejemplo y mira despues la configuración en el IExplorer, a mi me funciona. :D


delphi
  1. SetConnectionOptions('proxy.mi.empresa-data.com:8080', '', true);



Saludos.

  • 0

#9 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 09 octubre 2009 - 04:02

Bueno casi casi le pego :p, haciendo unos pequeños arreglos la cosa quedó así:



delphi
  1. function SetConnectionOptions(ProxyName: String; ProxyOverride: String; Use:bool): bool;
  2. var
  3.     list: INTERNET_PER_CONN_OPTION_LIST;
  4.     dwBufSize: DWORD;
  5.     Options: array[0..2] of INTERNET_PER_CONN_OPTION;
  6. begin
  7.     dwBufSize:= sizeof(list);
  8.  
  9.     // Rellenammos lo básico de la estructura list.
  10.     list.dwSize:= sizeof(list);
  11.  
  12.     // NULL == LAN, en otro caso es el nombre de la conexión.
  13.     list.pszConnection:= nil;
  14.  
  15.     // Vamos a trabajar con tres opciones.
  16.     list.dwOptionCount:= 3;
  17.     list.pOptions:= @(Options[0]);
  18.  
  19.     // flags.
  20.     Options[0].dwOption:= 1; //INTERNET_PER_CONN_FLAGS;
  21.     if(Use) then
  22.       Options[0].Value:= 1 or 2 //PROXY_TYPE_DIRECT or PROXY_TYPE_PROXY;
  23.     else
  24.       Options[0].Value:= 0;
  25.  
  26.     // proxy name.
  27.     Options[1].dwOption:= 2; //INTERNET_PER_CONN_PROXY_SERVER;
  28.     Options[1].Value:= PCHAR(ProxyName); //[Error] Unit1.pas(73): Incompatible types: 'Cardinal' and 'PAnsiChar'
  29.  
  30.     // proxy override.
  31.     Options[2].dwOption:= 3; //INTERNET_PER_CONN_PROXY_BYPASS;
  32.     Options[2].Value:= PCHAR(ProxyOverride); //[Error] Unit1.pas(77): Incompatible types: 'Cardinal' and 'PAnsiChar'
  33.     list.pOptions:= @(Options[0]);
  34.     // options on the connection.
  35.     Result:= InternetSetOption(nil, 75 {INTERNET_OPTION_PER_CONNECTION_OPTION}, @list, dwBufSize);
  36.  
  37.     // Obligamos a refrescar y notificamos el cambio al sistema...
  38.     InternetSetOption(0, INTERNET_OPTION_REFRESH, 0, 0);
  39.     InternetSetOption(0, INTERNET_OPTION_SETTINGS_CHANGED, 0, 0);
  40. end;



Salvo esos dos errores que señalo :(
  • 0

#10 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 09 octubre 2009 - 04:07

Y esto ¿serviria?  :^)



delphi
  1. uses Registry;
  2.  
  3. procedure EnableProxy(Server: String);
  4. begin
  5.   with TRegistry.Create do
  6.   try
  7.     RootKey:= HKEY_CURRENT_USER;
  8.     if OpenKey('Software\Microsoft\Windows\CurrentVersion\Internet Settings',FALSE) then
  9.     begin
  10.       WriteInteger('ProxyEnable',1);
  11.       WriteString('ProxyServer',Server);
  12.       // WriteString('ProxyOverride','<local>'); // Usar si hace falta
  13.     end;
  14.   finally
  15.     Free;
  16.   end;
  17. end;
  18.  
  19. EnableProxy('servidor.com:80');


  • 0

#11 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 09 octubre 2009 - 04:09

Fíjate en el código que te puse antes.

Las estructuras que te pasé, sacadas del archivo Wininet.h de Microsoft, no sabía bién como traducirlas a delphi, en concreto, la equivalencia del concepto de "union" de C, que significa que dos o mas variables comparten el mismo espacio de memoria. así que esta es la traducción correcta después de estudiar un poco el delphi:


delphi
  1. type
  2.   INTERNET_PER_CONN_OPTION = record
  3.   dwOption: DWORD;
  4.   case integer of
  5.     0:(dwValue:  DWORD;);
  6.     1:(pszValue:  LPTSTR;);
  7.     2:(ftValue:  FILETIME;);
  8.   end;
  9.   LPINTERNET_PER_CONN_OPTION = ^INTERNET_PER_CONN_OPTION;



El código que te puse funciona en delphi 6

Saludos.

  • 0

#12 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 09 octubre 2009 - 04:22

Y esto ¿serviria?  :^)



delphi
  1. uses Registry;
  2.  
  3. procedure EnableProxy(Server: String);
  4. begin
  5.   with TRegistry.Create do
  6.   try
  7.     RootKey:= HKEY_CURRENT_USER;
  8.     if OpenKey('Software\Microsoft\Windows\CurrentVersion\Internet Settings',FALSE) then
  9.     begin
  10.       WriteInteger('ProxyEnable',1);
  11.       WriteString('ProxyServer',Server);
  12.       // WriteString('ProxyOverride','<local>'); // Usar si hace falta
  13.     end;
  14.   finally
  15.     Free;
  16.   end;
  17. end;
  18.  
  19. EnableProxy('servidor.com:80');



Pues a mi entender, si sirve, sólo tiene una pega, no funciona en caliente, al menos a mi. Se debe reabrir el iExplorer para que lea la configuración. Yo siempre lo hice en C con la API porque lo puedes "refrescar" en caliente.

La traducción que he hecho funciona en mis pruebas. Probarlo vosotros y me comentáis.

Saludos.
  • 0

#13 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 09 octubre 2009 - 04:34

He probado tu code escafandra, al parecer en mi caso no funciona :s, compila bien pero no asigna nada, probé el de seoane, con el IE abierto sin ninguna config y me funcionó.
  • 0

#14 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 09 octubre 2009 - 04:57

He probado tu code escafandra, al parecer en mi caso no funciona :s, compila bien pero no asigna nada, probé el de seoane, con el IE abierto sin ninguna config y me funcionó.


Vaya, pues me gustaría saber que es lo que pasa. :(  Se me ocurre que quizás el problema está en el parámetro use de la función SetConnectionOptions. En uno de los post la coloqué a false y luego la edite para ponerla a true, esa opción correspondería a la "casilla" "usar un servidor proxy para la LAN..." de las Opciones de Internet->Conexiones->Configuración de LAN.


delphi
  1. SetConnectionOptions('proxy.mi.empresa-data.com:8080', '', true);



Por otro lado uso IE 8, aunque el código en C lo he usado en versiones menores que la 7 sin problemas. Y mi S.O. es WindowsXP. Y como dije antes, la modificación del registro que propone seoane no me funciona en caliente, de hecho nunca la he usado por ese problema. ¿Será cosa del S.O.?  :^) porque del IE no lo creo.

Saludos.
  • 0

#15 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 09 octubre 2009 - 05:06

Tengo el OS y la misma versión de IE, puede ser cosa de OS.
  • 0

#16 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 09 octubre 2009 - 05:10

Bueno, sólo queda que alguien mas lo pruebe en su versión delphi por si hubiese cometido algún error al traducir.  :)

Saludos.


  • 0

#17 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 10 octubre 2009 - 02:39

No es por ser pesado en el tema ni por desmerecer el excelente código de seoane, sino por curiosidad y ganas de complicarme la vida, asi como de entender el porqué de las cosas. Si algo funciona bien en C, debe hacerlo en delphi, sobre todo tratándose de APIs.

Al no funcionar igual, mi propuesta con la API InternetSetOption en delphi, en todas las maquinas y al haber tenido que traducir estructuras usadas para su manejo, pensé que podría ser un problema con el unicode.  Esas esctruturas tienen versión A y W, al igual que la API InternetSetOptionA y InternetSetOptionW. De esta forma, he forzado a usar la versión InternetSetOptionA. Quizás el problema está en como compila cada versión del delphi por no estar completas las definiciones, y mi torpeza en la traducción de las mismas. A mi me funciona bien (tanto con InternetSetOption como con InternetSetOptionA), con delphi 6 y en Windows XP profesional o Home y con IE desde la versión 6 (no he probado anteriores).

Subo un programa de ejemplo y su fuente. Si tienes la amabilidad, enecumene, o cualquiera de vosotros, de probarlo quizás me saqueis de dudas y pueda entender un poco mejor al delphi y sus correspondencias con C.  :)

Saludos.
  • 0

#18 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 10 octubre 2009 - 06:07

Hola escafandra, acabo de descargar el zip y probé el programa y ahora me funcionó :D (y).
  • 0

#19 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 10 octubre 2009 - 06:20

Hola escafandra, acabo de descargar el zip y probé el programa y ahora me funcionó :D (y).


Muchas gracias por tomarte la molestia, ya me estaba volviendo loco :p.

Ahora, si no es pedirte mucho, ¿Podrias hacer la prueba cambiando InternetSetOptionA por InternetSetOption?. De esta forma, si no funciona, sabremos que es un problema del unicode, que tendríamos que tener en cuenta a la hora de realizar otras adaptaciones de APIs a delphi en el futuro.  :D

Saludos.
  • 0

#20 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 10 octubre 2009 - 02:17

Hola, lo acabo de probar como InternetSetOption y tambiém funcionó :D (y) gracias de nuevo.
  • 0




IP.Board spam blocked by CleanTalk.