<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel><category>pcsoft.fr.windev</category><copyright>Copyright 2026, PC SOFT</copyright><lastBuildDate>15 Dec 2019 07:38:50 Z</lastBuildDate><pubDate>15 Dec 2019 07:38:50 Z</pubDate><description>Bonjour a tous,&#13;
&#13;
Voici à qui voudra bien faire une bonne action, un petit casse-tête pour enjoliver nos belles journée engrévées.&#13;
j'utilise un system.windows.forms.webbrowser que je souhaite connecter à un proxy&#13;
vous comprendrez que si je viens à vous, c'est que la fonction Proxy(ProxyAddress,ProxyPort) ne fonctionne pas sur les composants dotnet. ;(&#13;
&#13;
j'ai trouvé sur le code en C# suivant qui me parait assez accessible.&#13;
&#13;
[code:text]&#13;
public static bool SetConnectionProxy(string proxyServer)&#13;
        {&#13;
            IntPtr hInternet = InternetOpen(agentName, INTERNET_OPEN_TYPE_DIRECT, null, null, 0);&#13;
&#13;
            INTERNET_PER_CONN_OPTION[] options = new INTERNET_PER_CONN_OPTION[2];&#13;
            options[0] = new INTERNET_PER_CONN_OPTION();&#13;
            options[0].dwOption = (int)INTERNET_PER_CONN_OPTIONENUM.INTERNET_PER_CONN_FLAGS;&#13;
            options[0].value.dwValue = (int)INTERNET_OPTION_PER_CONN_FLAGS.PROXY_TYPE_PROXY;&#13;
&#13;
            options[1] = new INTERNET_PER_CONN_OPTION();&#13;
            options[1].dwOption = (int)INTERNET_PER_CONN_OPTIONENUM.INTERNET_PER_CONN_PROXY_SERVER;&#13;
            options[1].value.pszValue = Marshal.StringToHGlobalAnsi(proxyServer);&#13;
&#13;
            IntPtr buffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(options[0]) + Marshal.SizeOf(options[1]));&#13;
            IntPtr current = buffer;&#13;
&#13;
            for (int i = 0; i &lt; options.Length; i++)&#13;
            {&#13;
                Marshal.StructureToPtr(options[i], current, false);&#13;
                current = (IntPtr)((int)current + Marshal.SizeOf(options[i]));&#13;
            }&#13;
&#13;
            INTERNET_PER_CONN_OPTION_LIST optionList = new INTERNET_PER_CONN_OPTION_LIST();&#13;
            optionList.pOptions = buffer;&#13;
            optionList.Size = Marshal.SizeOf(optionList);&#13;
            optionList.Connection = IntPtr.Zero;&#13;
            optionList.OptionCount = options.Length;&#13;
            optionList.OptionError = 0;&#13;
&#13;
            int size = Marshal.SizeOf(optionList);&#13;
            IntPtr intPtrStruct = Marshal.AllocCoTaskMem(size);&#13;
            Marshal.StructureToPtr(optionList, intPtrStruct, true);&#13;
&#13;
            bool bReturn = InternetSetOption(hInternet, INTERNET_OPTION.INTERNET_OPTION_PER_CONNECTION_OPTION, intPtrStruct, size);&#13;
&#13;
            Marshal.FreeCoTaskMem(buffer);&#13;
            Marshal.FreeCoTaskMem(intPtrStruct);&#13;
&#13;
            InternetCloseHandle(hInternet);&#13;
&#13;
            return bReturn;&#13;
        }&#13;
[/code]&#13;
&#13;
je rencontre ici pusieurs problèmes. J'ai partiellement rtaduit avec succès le code en WD, mais certaines fonctions dotnet ont l'air de bugger (pas toutes) comme Marshal.SizeOf ou bien Marshal.StructureToPtr&#13;
&#13;
je vous partage mon code au cas ou l'un d'entre vous souhaiterais me donner un coup de mains, ainsi que pour l'ensemble de la communauté.&#13;
&#13;
1) déclaration globale au démarrage du projet (il fonctionne nickel)&#13;
&#13;
[code:wl]&#13;
INTERNET_PER_CONN_OPTION_LIST est une Structure&#13;
	Size est un entier&#13;
	Connection est un IntPtr dynamique&#13;
	OptionCount est un entier&#13;
	OptionError est un entier&#13;
	pOptions est un IntPtr dynamique&#13;
FIN&#13;
&#13;
INTERNET_OPTION est une Enumération&#13;
	INTERNET_OPTION_PER_CONNECTION_OPTION = 75&#13;
	INTERNET_OPTION_SETTINGS_CHANGED = 39&#13;
	INTERNET_OPTION_REFRESH = 37&#13;
FIN&#13;
&#13;
INTERNET_PER_CONN_OPTIONENUM est une Enumération&#13;
	INTERNET_PER_CONN_FLAGS = 1&#13;
	INTERNET_PER_CONN_PROXY_SERVER = 2&#13;
	INTERNET_PER_CONN_PROXY_BYPASS = 3&#13;
	INTERNET_PER_CONN_AUTOCONFIG_URL = 4&#13;
	INTERNET_PER_CONN_AUTODISCOVERY_FLAGS = 5&#13;
	INTERNET_PER_CONN_AUTOCONFIG_SECONDARY_URL = 6&#13;
	INTERNET_PER_CONN_AUTOCONFIG_RELOAD_DELAY_MINS = 7&#13;
	INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_TIME = 8&#13;
	INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_URL = 9&#13;
	INTERNET_PER_CONN_FLAGS_UI = 10&#13;
FIN&#13;
&#13;
CONSTANTE&#13;
	INTERNET_OPEN_TYPE_DIRECT = 1&#13;
	INTERNET_OPEN_TYPE_PRECONFIG = 0&#13;
	agentName = "Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko"&#13;
FIN&#13;
&#13;
INTERNET_OPTION_PER_CONN_FLAGS est une Enumération&#13;
	PROXY_TYPE_DIRECT = 0x00000001   // direct to net&#13;
	PROXY_TYPE_PROXY = 0x00000002   // via named proxy&#13;
	PROXY_TYPE_AUTO_PROXY_URL = 0x00000004   // autoproxy URL&#13;
	PROXY_TYPE_AUTO_DETECT = 0x00000008   // use autoproxy detection&#13;
FIN&#13;
 &#13;
INTERNET_PER_CONN_OPTION_OPTIONUNION est une Structure&#13;
	dwValue est un entier&#13;
	pszValue est un IntPtr dynamique&#13;
	ftValue est un System.Runtime.InteropServices.FILETIME dynamique&#13;
FIN&#13;
&#13;
INTERNET_PER_CONN_OPTION est une Structure&#13;
	dwOption est un entier&#13;
	value est un INTERNET_PER_CONN_OPTION_OPTIONUNION&#13;
FIN&#13;
&#13;
SetProcessDPIAware est une Description d'API&#13;
SetProcessDPIAware..NomDLL = "user32.dll"&#13;
SetProcessDPIAware..NomFonction = "SetProcessDPIAware"&#13;
SetProcessDPIAware..TypeRetour = apiBooléen&#13;
&#13;
InternetOpen est une Description d'API&#13;
InternetOpen..NomDLL = "wininet.dll"&#13;
InternetOpen..NomFonction = "InternetOpenA"&#13;
InternetOpen..Paramètre[1]..Type = apiChaîne&#13;
InternetOpen..Paramètre[2]..Type = apiEntierSystème&#13;
InternetOpen..Paramètre[3]..Type = apiChaîne&#13;
InternetOpen..Paramètre[4]..Type = apiChaîne&#13;
InternetOpen..Paramètre[5]..Type = apiEntierSystème&#13;
InternetOpen..TypeRetour = IntPtr&#13;
&#13;
InternetCloseHandle est une Description d'API&#13;
InternetCloseHandle..NomDLL = "wininet.dll"&#13;
InternetCloseHandle..NomFonction = "InternetCloseHandle"&#13;
InternetOpen..Paramètre[1]..Type = apiEntierSystème&#13;
InternetCloseHandle..TypeRetour = apiBooléen&#13;
&#13;
InternetSetOption est une Description d'API&#13;
InternetSetOption..NomDLL = "wininet.dll"&#13;
InternetSetOption..NomFonction = "InternetSetOption"&#13;
InternetSetOption..Paramètre[1]..Type = apiEntierSystème&#13;
InternetSetOption..Paramètre[2]..Type = apiEntierSystème&#13;
InternetSetOption..Paramètre[3]..Type = apiEntierSystème&#13;
InternetSetOption..Paramètre[4]..Type = apiEntierSystème&#13;
InternetSetOption..TypeRetour = apiBooléen&#13;
&#13;
InternetQueryOptionList est une Description d'API&#13;
InternetQueryOptionList..NomDLL = "wininet.dll"&#13;
InternetQueryOptionList..NomFonction = "InternetQueryOptionList"&#13;
InternetQueryOptionList..Paramètre[1]..Type = apiEntierSystème&#13;
InternetQueryOptionList..Paramètre[2]..Type = apiEntierSystème&#13;
InternetQueryOptionList..Paramètre[3]..Type = "INTERNET_PER_CONN_OPTION_LIST"&#13;
InternetQueryOptionList..Paramètre[4]..Type = apiEntierSystème&#13;
InternetQueryOptionList..TypeRetour = apiBooléen&#13;
&#13;
[/code]&#13;
&#13;
2) code d'initialisation de la fenetre (il fonctionne nickel aussi)&#13;
&#13;
[code:wl]&#13;
SI PAS SetConnectionProxy("127.0.0.1:"+8080) ALORS&#13;
	Info("The application could not set the default connection proxy. The browser control is not using the tor service as a proxy!", "Error")	&#13;
FIN&#13;
[/code]&#13;
&#13;
3) le code de la fonction SetConnectionProxy traduit en windev&#13;
&#13;
[code:wl]&#13;
PROCÉDURE SetConnectionProxy(proxyServer est une chaîne) :booléen&#13;
&#13;
hInternet est un IntPtr dynamique = InternetOpen(agentName, INTERNET_OPEN_TYPE_DIRECT, Null, Null, 0)&#13;
&#13;
options est un tableau de 2 INTERNET_PER_CONN_OPTION&#13;
options[1].dwOption = INTERNET_PER_CONN_OPTIONENUM.INTERNET_PER_CONN_FLAGS&#13;
options[1].value.dwValue = INTERNET_OPTION_PER_CONN_FLAGS.PROXY_TYPE_PROXY&#13;
&#13;
options[2].dwOption = INTERNET_PER_CONN_OPTIONENUM.INTERNET_PER_CONN_PROXY_SERVER..Valeur&#13;
options[2].value.pszValue = Marshal.StringToHGlobalAnsi(proxyServer)&#13;
&#13;
//Marshal.SizeOf remplacé par 'Dimension'&#13;
buffer est un IntPtr dynamique = Marshal.AllocCoTaskMem(Dimension(options[1]) + Dimension(options[2]))&#13;
current est un IntPtr dynamique = buffer &#13;
&#13;
NBBoucles est un entier = options.Occurrence()&#13;
&#13;
POUR i = 1 À NBBoucles&#13;
	Marshal.StructureToPtr(options[i], current, False)&#13;
	current +=  Dimension(options[i])&#13;
FIN&#13;
&#13;
optionList est un INTERNET_PER_CONN_OPTION_LIST&#13;
optionList.pOptions = buffer&#13;
optionList.Size = Dimension(optionList)&#13;
optionList.Connection = IntPtr.Zero&#13;
optionList.OptionCount = options.Occurrence()&#13;
optionList.OptionError = 0&#13;
&#13;
size est un entier = Dimension(optionList)&#13;
intPtrStruct est un IntPtr dynamique = Marshal.AllocCoTaskMem(size)&#13;
Marshal.StructureToPtr(optionList, intPtrStruct, True)&#13;
&#13;
bReturn est un booléen = InternetSetOption(hInternet, INTERNET_OPTION.INTERNET_OPTION_PER_CONNECTION_OPTION, intPtrStruct, size)&#13;
&#13;
Marshal.FreeCoTaskMem(buffer)&#13;
Marshal.FreeCoTaskMem(intPtrStruct)&#13;
&#13;
InternetCloseHandle(hInternet)&#13;
&#13;
RENVOYER bReturn&#13;
[/code]&#13;
&#13;
Je bloque sur la boucle ligne 37. Marshal.StructureToPtr me renvoie une erreur de chargement de mscorlib.dll mais celle-ci est bien chargée et utilisée pour les autres appels sur Marshal.StringToHGlobalAnsi par exemple&#13;
&#13;
[code:wl]&#13;
POUR i = 1 À NBBoucles&#13;
	Marshal.StructureToPtr(options[i], current, False)&#13;
	current +=  Dimension(options[i])&#13;
FIN&#13;
[/code]&#13;
&#13;
merci par avance sur votre coup de main.&#13;
&#13;
Hugues</description><ttl>30</ttl><generator>WEBDEV</generator><language>fr_FR</language><link>https://forum.pcsoft.fr/es-ES/pcsoft.fr.windev/235487-creation-proxy-pour-objet-dotnet-system-windows-forms/read.awp</link><title>creation d'un proxy pour objet dotnet system.windows.forms.webbrowser</title><managingEditor>moderateur@pcsoft.fr (El moderador)</managingEditor><webMaster>webmaster@pcsoft.fr (El webmaster)</webMaster></channel></rss>
