<rss version="2.0" xmlns:a10="http://www.w3.org/2005/Atom"><channel><title>Dicas Técnicas BufaloInfo</title><link>http://www.bufaloinfo.com.br/</link><description>Dicas Técnicas Produzidas pela Búfalo Informática</description><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=898</link><title>Visual Basic : Otimizando aplicações ASP.NET : Worker Threads</title><description>&lt;br&gt;O arquivo web.config nos permite ajustar diversas configura&amp;#231;&amp;#245;es de execu&amp;#231;&amp;#227;o do ASP.NET, nos permitindo otimizar ao m&amp;#225;ximo sua execu&amp;#231;&amp;#227;o. Vale citar ainda que no IIS 7 (Vista/Windows Server 2008) toda a configura&amp;#231;&amp;#227;o do IIS &amp;#233; feita pelos arquivos .config&lt;br&gt;&lt;br&gt;Uma das configura&amp;#231;&amp;#245;es que podemos controlar s&amp;#227;o as worker threads. Cada worker thread, basicamente uma thread do sistema operacional, &amp;#233; respons&amp;#225;vel por receber uma requisi&amp;#231;&amp;#227;o de um client e processar. Se o n&amp;#250;mero de worker threads for muito inferior ao n&amp;#250;mero de requisi&amp;#231;&amp;#245;es *simultaneas* dos clients, os clients come&amp;#231;am a ser enfileirados e voc&amp;#234; tem um problema de performance.&lt;br&gt;&lt;br&gt;O n&amp;#250;mero de worker threads que voc&amp;#234; aplicar vale para cada processo de execu&amp;#231;&amp;#227;o do site e poder&amp;#227;o haver mais de um no caso de multiplos cores ou processadores na m&amp;#225;quina.&lt;br&gt;&lt;br&gt;Como decidir se o n&amp;#250;mero est&amp;#225; bom ou n&amp;#227;o ? &lt;br&gt;&lt;br&gt;Pode-se utilizar o system monitor para analisar contadores de performance como por exemplo &amp;quot;solicita&amp;#231;&amp;#245;es enfileiradas&amp;quot;, permitindo saber se &amp;#233; ou n&amp;#227;o necess&amp;#225;rio aumentar o n&amp;#250;mero de worker threads.&lt;br&gt;&lt;br&gt;Al&amp;#233;m disso, observe que se sua aplica&amp;#231;&amp;#227;o usa pouco o processador e muito a comunica&amp;#231;&amp;#227;o, leitura, resposta, etc, um n&amp;#250;mero maior de worker threads &amp;#233; poss&amp;#237;vel. Se sua aplica&amp;#231;&amp;#227;o usa muito o processador, um n&amp;#250;mero grande de worker threads pode engargalar o servidor.&lt;br&gt;&lt;br&gt;Para ter uma no&amp;#231;&amp;#227;o da import&amp;#226;ncia ou n&amp;#227;o desta configura&amp;#231;&amp;#227;o para o seu site, pegue o n&amp;#250;mero de visitas mensais ao site e divida pelo n&amp;#250;mero de minutos existente em 1 m&amp;#234;s. O resultado fornece um n&amp;#250;mero levemente aproximado das visitas simult&amp;#226;neas que seu site possui.&lt;br&gt;&lt;br&gt;Enfim, para configurar o n&amp;#250;mero total de worker threads insira no web.config :&lt;br&gt;&lt;br&gt;&amp;lt;processModel maxWorkerThreads=&amp;quot;100&amp;quot; /&amp;gt;&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=847</link><title>Visual Basic : Utilizando o profile no Global.asax</title><description>&lt;br&gt;Um &amp;#243;timo local para inicializar dados do Profile do ASP.NET seria o session_start no Global.asax, ou seja, a sess&amp;#227;o do usu&amp;#225;rio come&amp;#231;a e de imediato ajustamos o seu profile.&lt;br&gt;&lt;br&gt;Por&amp;#233;m existe um problema nisso : O objeto Profile n&amp;#227;o encontra-se dispon&amp;#237;vel durante o session_onstart. Na sequencia de eventos no servidor, o objeto Profile &amp;#233; criado apenas bem depois, *durante* o evento acquireRequestState.&lt;br&gt;&lt;br&gt;Por isso o primeiro evento seguro para fazermos uso do profile &amp;#233; o PostAcquireRequestState.&lt;br&gt;&lt;br&gt;Por&amp;#233;m este evento ocorre em todos os postBacks e n&amp;#227;o apenas no start da sess&amp;#227;o. Por isso para que a configura&amp;#231;&amp;#227;o de profile ocorra apenas no start da sess&amp;#227;o precisaremos definir um flag (uma vari&amp;#225;vel boolean) no session_onstart e testa-la no postAcquireRequestState.&lt;br&gt;&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=477</link><title>Visual Basic : Controlando o timeout</title><description>&lt;br&gt;O banco de dados (SQL Server) por default n&amp;#227;o define um tempo de timeout, ou seja, uma instru&amp;#231;&amp;#227;o poderia esperar indefinidamente para que seja executada e &amp;#233; isso que acontece se for utilizado o query analyser do sql server.&lt;br&gt;&lt;br&gt;Mas quando fazemos a execu&amp;#231;&amp;#227;o via aplica&amp;#231;&amp;#227;o, se a instru&amp;#231;&amp;#227;o demora muito a ser executada ocorre um timeout. Por que ?&lt;br&gt;&lt;br&gt;Porque o OLEDB, como intermedi&amp;#225;rio na comunica&amp;#231;&amp;#227;o entre aplica&amp;#231;&amp;#227;o e banco, possui um timeout definido e aborta a execu&amp;#231;&amp;#227;o se esse timeout for atingido.&lt;br&gt;&lt;br&gt;Para alterarmos o timeout do oledb devemos definir o valor da propriedade commandtimeout, que existe tanto em objetos command como no objeto connection. Se o valor desta propriedade for definido como 0, o timeout fica infinito.&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=433</link><title>Visual Basic : Criar uma string de conexão pela janela de conexão OLEDB - VB 6</title><description>&lt;br&gt;Vimos esta dica anteriormente para o VB.NET, mas tamb&amp;#233;m &amp;#233; poss&amp;#237;vel realizar isso em VB 6 sem dificuldade, afinal, a biblioteca que permite a abertura do di&amp;#225;logo de conex&amp;#227;o OLEDB &amp;#233; uma biblioteca COM, perfeitamente acess&amp;#237;vel pelo VB 6.&lt;br&gt;&lt;br&gt;No caso do VB 6 marcamos references para a biblioteca OLEDB Service Component 1.0 Type Library. Essa biblioteca nem sempre aparece no references, portanto se n&amp;#227;o estiver l&amp;#225; precisaremos utilizar o browse e localiza-la no seguinte caminho : program files\common files\system\ole db\oledb32.dll&lt;br&gt;&lt;br&gt;Veja como fica o c&amp;#243;digo :&lt;br&gt;&lt;br&gt;Dim dataLink As New MSDASC.DataLinks&lt;br&gt;Dim connString As String&lt;br&gt;Dim cn As New ADODB.Connection&lt;br&gt;&lt;br&gt;' abaixo fazemos um v&amp;#237;nculo da janela oledb com o formul&amp;#225;rio atual&lt;br&gt;dataLink.hWnd = Me.hWnd&lt;br&gt;&lt;br&gt;' Exibimos o di&amp;#225;logo no promptnew&lt;br&gt;On Error Resume Next&lt;br&gt;connString = dataLink.PromptNew&lt;br&gt;If Err = 0 Then&lt;br&gt;    ' Utilizamos a connection string obtida em um objeto de conex&amp;#227;o&lt;br&gt;    cn.ConnectionString = connString&lt;br&gt;Else&lt;br&gt;    ' Usu&amp;#225;rio cancelou a opera&amp;#231;&amp;#227;o&lt;br&gt;End If&lt;br&gt;&lt;br&gt;&lt;br&gt;'No exemplo abaixo, outra forma de abrir a janela, utiliza-se o m&amp;#233;todo &lt;br&gt;' promptEdit, ao inv&amp;#233;s de promptnew, para editar a string de conex&amp;#227;o de um&lt;br&gt;' objeto de conex&amp;#227;o existente&lt;br&gt;If dataLink.PromptEdit(cn) Then&lt;br&gt;    MsgBox cn.ConnectionString&lt;br&gt;Else&lt;br&gt;    MsgBox &amp;quot;Cancelou&amp;quot;&lt;br&gt;End If&lt;br&gt;&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=412</link><title>Visual Basic : Simplificar o registro de DLLs no S.O.</title><description>&lt;br&gt;Quando trabalhamos com a cria&amp;#231;&amp;#227;o de componentes COM a necessidade de registrar e desregistrar DLLs &amp;#233; muito frequente. Para registrar ou desregistrar DLLs utilizamos o regsvr32 com ou sem a op&amp;#231;&amp;#227;o /U .&lt;br&gt;&lt;br&gt;Mas como essa necessidade &amp;#233; muito frequente, podemos utilizar um truque de registry para simplificar o registro da DLL :&lt;br&gt;&lt;br&gt;Em primeiro lugar devemos encontrar uma key chamada dllfile dentro da key HKEY_CLASSES_ROOT. dllfile representa os arquivos dll.&lt;br&gt;&lt;br&gt;Abre-se essa key e, caso j&amp;#225; n&amp;#227;o exista, devemos criar uma sub-key chamada shell.&lt;br&gt;&lt;br&gt;Abaixo da sub-key shell criamos sub-keys com nomes de instru&amp;#231;&amp;#245;es que aparecer&amp;#227;o ao clicarmos com o bot&amp;#227;o direito sobre este arquivo. Por exemplo, podemos criar, abaixo de shell, as keys &amp;quot;Registrar&amp;quot; e &amp;quot;Desregistrar&amp;quot;.&lt;br&gt;&lt;br&gt;Abaixo de cada uma das &amp;#250;ltimas keys criadas devemos criar a key &amp;quot;Command&amp;quot;.&lt;br&gt;&lt;br&gt;Dentro da key command, no lado direito do registry, devemos utilizar um duplo clique para editar o valor default. Para registrar digitamos &amp;quot;Regsvr32 %1&amp;quot; (sem as aspas) enquanto que para desregistrar digitamos &amp;quot;Regsvr32 %1 /u&amp;quot;&lt;br&gt;&lt;br&gt;Voltando &amp;#224; key shell, podemos alterar seu valor default para o nome de uma de suas sub-keys, determinando assim qual ser&amp;#225; a instru&amp;#231;&amp;#227;o default.&lt;br&gt;&lt;br&gt;Ao clicarmos com o bot&amp;#227;o direito sobre um arquivo DLL veremos ambas as instru&amp;#231;&amp;#245;es criadas. Se utilizarmos duplo clique a instru&amp;#231;&amp;#227;o default ser&amp;#225; executada.&lt;br&gt;&lt;br&gt;A chave shell pode ser posteriormente exportada para um arquivo .REG, sendo assim basta dar um duplo clique no arquivo .REG e as novas entradas de registry s&amp;#227;o implantadas&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=407</link><title>Visual Basic : Alguns mistérios da compatibilidade binária</title><description>&lt;br&gt;A compatibilidade bin&amp;#225;ria, necess&amp;#225;ria no momento da recompila&amp;#231;&amp;#227;o de componentes em especial em um sistema no qual existam muitos componentes utilizando outros componentes, pode ser um grande problema de gerenciamento.&lt;br&gt;&lt;br&gt;Garantir que todos os programadores a utilizem e nunca haja uma quebra de compatibilidade ou, se houver em um componente A, por exemplo, que os componentes que usam o componente A sejam recompilados, isso j&amp;#225; &amp;#233; um problema.&lt;br&gt;&lt;br&gt;Mas o mecanismo da compatibilidade bin&amp;#225;ria esconde alguns mist&amp;#233;rios a mais. Os programadores sabem que para manter a compatibilidade bin&amp;#225;ria &amp;#233; necess&amp;#225;rio que n&amp;#227;o hajam altera&amp;#231;&amp;#245;es na interface. Por&amp;#233;m o Visual Basic &amp;#233; muito amig&amp;#225;vel com os programadores e permite que mesmo que hajam altera&amp;#231;&amp;#245;es em par&amp;#226;metros ou inser&amp;#231;&amp;#227;o de novos m&amp;#233;todos a compatibilidade bin&amp;#225;ria seja mantida. Por&amp;#233;m isso tem um custo.&lt;br&gt;&lt;br&gt;Vamos imaginar um cen&amp;#225;rio. O componente A utiliza o componente B e o componente B sempre &amp;#233; compilado com a compatibilidade bin&amp;#225;ria. Mas compilar o componente B, que j&amp;#225; ganhou muitos novos m&amp;#233;todos, com compatibilidade bin&amp;#225;ria tem uma consequencia que muitos programadores n&amp;#227;o conhece : O ID (GUID) da interface default do component B muda. Ele mant&amp;#233;m o ID antigo, mas passa a ter tamb&amp;#233;m um novo.&lt;br&gt;&lt;br&gt;Imagine nesse cen&amp;#225;rio que a empresa possui um ambiente de desenvolvimento e um para homologa&amp;#231;&amp;#227;o e que no momento os componentes est&amp;#227;o funcionando em ambos os ambientes. Se o componente B &amp;#233; recompilado e reinserido no ambiente de homologa&amp;#231;&amp;#227;o ele ganha um novo ID de interface, mas mant&amp;#233;m o antigo. Assim sendo, o componente A que encontra-se no ambiente de homologa&amp;#231;&amp;#227;o e que s&amp;#243; conhece o ID de interface antigo ainda consegue acessa-lo, por&amp;#233;m se o componente A em desenvolvimento for recompilado, seu novo execut&amp;#225;vel (dll) passar&amp;#225; a utilizar o novo ID de interface do componente B.&lt;br&gt;&lt;br&gt;Imaginemos que mais uma vez o componente B foi atualizado em desenvolvimento, mas n&amp;#227;o foi passado para homologa&amp;#231;&amp;#227;o. O componente A tamb&amp;#233;m foi atualizado em desenvolvimento, recompilado, e resolveu-se passa-lo para homologa&amp;#231;&amp;#227;o.&lt;br&gt;Resultado : Por ter sido recompilado, o componente A aponta para o ID de interface do componente B mais atualizado. Por&amp;#233;m ao ser inserido no ambiente de homologa&amp;#231;&amp;#227;o o componente A encontrar&amp;#225; um componente B que n&amp;#227;o possui essa interface. Consequentemente teremos uma falha no relacionamento entre o componente A e o componente B.&lt;br&gt;&lt;br&gt;Resumindo : Se o componente A for compilado fazendo references para uma vers&amp;#227;o mais antiga do componente B, ele pode ser perfeitamente utilizado com a vers&amp;#227;o mais nova, pois esta guarda o ID de interface antigo. Mas se o componente A for compilado com uma vers&amp;#227;o mais nova do componente B, mesmo que n&amp;#227;o utilize nenhum recurso novo ele n&amp;#227;o pode ser utilizado com uma vers&amp;#227;o mais antiga, pois guardou o ID da nova interface. E tudo isso acontece mesmo com a compatibilidade bin&amp;#225;ria estando sempre marcada.&lt;br&gt;&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=404</link><title>Visual Basic : Registrando um componente via código - forma alternativa</title><description>&lt;br&gt;Na dica 74 (http://www.bufaloinfo.com.br/dicas.asp?cod=74) j&amp;#225; haviamos visto como utilizar APIs para registrar um componente via c&amp;#243;digo. &lt;br&gt;&lt;br&gt;Mas existe uma forma alternativa de fazer esse registro. Podemos utilizar uma biblioteca COM chamada Type Library Information (deve ser marcada no references para utilizarmos early binding) para manipular a type library de um componente e isso inclui registra-lo e desregistra-lo. Veja :&lt;br&gt;&lt;br&gt;Private Sub Form_Load()&lt;br&gt;&lt;br&gt;Dim x As New TLI.TLIApplication&lt;br&gt;Dim y As TypeLibInfo&lt;br&gt;&lt;br&gt;&lt;br&gt;     Set y = x.TypeLibInfoFromFile(&amp;quot;C:\teste\com\prjteste.dll&amp;quot;)&lt;br&gt;&lt;br&gt;     y.Register&lt;br&gt;&lt;br&gt;End Sub&lt;br&gt;&lt;br&gt;O m&amp;#233;todo TypeLibInfoFromFile carrega a type library a partir da DLL e o m&amp;#233;todo Register se encarrega de registrar o componente na m&amp;#225;quina. Desregistrar o componente tamb&amp;#233;m &amp;#233; muito simples, veja :&lt;br&gt;&lt;br&gt;Private Sub Form_Load()&lt;br&gt;&lt;br&gt;Dim x As New TLI.TLIApplication&lt;br&gt;Dim y As TypeLibInfo&lt;br&gt;&lt;br&gt;&lt;br&gt;      Set y = x.TypeLibInfoFromFile(&amp;quot;C:\teste\com\prjteste.dll&amp;quot;)&lt;br&gt;&lt;br&gt;      y.UnRegister&lt;br&gt;&lt;br&gt;End Sub&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=401</link><title>Visual Basic : Identificando as classes existentes em uma DLL</title><description>&lt;br&gt;Na dica 74 (http://www.bufaloinfo.com.br/dicas.asp?cod=74) expliquei como registrar um componente via c&amp;#243;digo. Isso &amp;#233; muito &amp;#250;til para o late binding. Mas ainda fica algo pendente : Como descobrir o progID de cada classe existente no componente ?&lt;br&gt;&lt;br&gt;Para resolver esse problema encontramos uma biblioteca COM chamada TypeLib Information. Podemos ent&amp;#227;o fazer o references para esta biblioteca e utiliza-la para descobrir as classes contidas em uma DLL. &lt;br&gt;&lt;br&gt;Considerando que temos um form com uma listbox, observe o seguinte c&amp;#243;digo :&lt;br&gt;&lt;br&gt;Dim x As New TLI.TLIApplication&lt;br&gt;Dim y As TypeLibInfo&lt;br&gt;Dim z As SearchResults&lt;br&gt;Dim w As SearchItem&lt;br&gt;&lt;br&gt;    Set y = x.TypeLibInfoFromFile(&amp;quot;C:\Max\Exercicio08\BancosdeDados.dll&amp;quot;)&lt;br&gt;    List1.AddItem y.Name&lt;br&gt;    Set z = y.GetTypes()&lt;br&gt;    &lt;br&gt;    For Each w In z&lt;br&gt;         List1.AddItem w.Name&lt;br&gt;    Next&lt;br&gt;    &lt;br&gt;O m&amp;#233;todo TypeLibInfoFromFile carrega a type library contida em uma DLL, resultando em um objeto do tipo TyhpeLibInfo. A propriedade Name que adicionamos na listbox &amp;#233; o nome da biblioteca, ou seja, a 1a parte do progID. &lt;br&gt;&lt;br&gt;Em seguida utilizamos o m&amp;#233;todo GetTypes para obter os tipos (classes) contidos dentro da type library e fazemos um for/each para inseri-los na listbox.&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=372</link><title>Visual Basic : Controlando o tempo em loops</title><description>&lt;br&gt;Inicialmente poderia parecer complicado fazer com que um determinado loop rode exatamente por um determinado periodo de tempo (segundos ou algo menor que isso), mas utilizando algumas fun&amp;#231;&amp;#245;es da API do windows podemos obter esse resultado. Veja :&lt;br&gt;&lt;br&gt;#If Win32 Then&lt;br&gt;	Private Declare Function GetTickCount _&lt;br&gt;		Lib &amp;quot;kernel32&amp;quot; () As Long&lt;br&gt;#Else&lt;br&gt;	Private Declare Function GetTickCount _&lt;br&gt;		Lib &amp;quot;User&amp;quot; () As Long&lt;br&gt;#End If&lt;br&gt;&lt;br&gt;Essa fun&amp;#231;&amp;#227;o, GetTickCount, nos fornece um n&amp;#250;mero que funciona quase que como um timer. Utilizando uma fun&amp;#231;&amp;#227;o que nos d&amp;#234; a diferen&amp;#231;a entre 2 chamadas de GetTickCount chegamos ao resultado desejado. Veja a fun&amp;#231;&amp;#227;o :&lt;br&gt;&lt;br&gt;Public Function TickDiff( _&lt;br&gt;	ByVal TickStart As Currency, _&lt;br&gt;	ByVal TickEnd As Currency) As Long&lt;br&gt;&lt;br&gt;	' CCur(2 ^ 32)&lt;br&gt;	Const TwoToThe32nd As Currency = 4294967296@&lt;br&gt;&lt;br&gt;	' Handle two's complement for values larger than &lt;br&gt;	' 2147483647&amp;amp;&lt;br&gt;	If TickStart &amp;lt; 0 Then&lt;br&gt;		TickStart = TickStart + TwoToThe32nd&lt;br&gt;	End If&lt;br&gt;	' Handle two's complement AND the case where&lt;br&gt;	' timeGetTime/GetTickCount wraps at (2 ^ 32)ms,&lt;br&gt;	' or ~49.7 days:&lt;br&gt;	If (TickEnd &amp;lt; 0) Or (TickEnd &amp;lt; TickStart) Then&lt;br&gt;		TickEnd = TickEnd + TwoToThe32nd&lt;br&gt;	End If&lt;br&gt;	' Return the result&lt;br&gt;	TickDiff = TickEnd - TickStart&lt;br&gt;End Function&lt;br&gt;&lt;br&gt;Agora veja como utiliza-la :&lt;br&gt;&lt;br&gt;Public Sub SampleLoop()&lt;br&gt;	Dim TickStart As Currency&lt;br&gt;	TickStart = GetTickCount()&lt;br&gt;	' Loop for 5 seconds&lt;br&gt;	Do While TickDiff(TickStart, GetTickCount()) _&lt;br&gt;		&amp;lt; 5000&lt;br&gt;		' loop code here&lt;br&gt;	Loop&lt;br&gt;End Sub&lt;br&gt;&lt;br&gt;Primeiramente foi pego na vari&amp;#225;vel TickStart o valor de GetTickCount. O loop ent&amp;#227;o &amp;#233; feito com base no resultado da fun&amp;#231;&amp;#227;o TickDiff : Quando a diferen&amp;#231;a entre o start e o GetTickCount atual for maior que 5000 (5 segundos) o loop para.&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=367</link><title>Visual Basic : Enviando dados via POST com o INET</title><description>&lt;br&gt;O componente INET do VB nos permite fazer transmiss&amp;#245;es de dados via m&amp;#233;todo POST, nos permitindo realizar comunica&amp;#231;&amp;#245;es, troca de dados, com p&amp;#225;ginas na web mesmo que estas n&amp;#227;o tenham sido preparadas para este fim.&lt;br&gt;&lt;br&gt;A transmiss&amp;#227;o POST apenas pode ser realizada atrav&amp;#233;s do m&amp;#233;todo EXECUTE e n&amp;#227;o atrav&amp;#233;s do m&amp;#233;todo OPENURL. Mas al&amp;#233;m disso existe um truque para que a transmiss&amp;#227;o funcione : &amp;#201; necess&amp;#225;rio enviar ao servidor um cabe&amp;#231;alho indicando o que est&amp;#225; sendo transmitido, do contr&amp;#225;rio o servidor ir&amp;#225; ignorar os dados.&lt;br&gt;&lt;br&gt;Veja um pequeno exemplo :&lt;br&gt;&lt;br&gt; Inet1.Execute &amp;quot;http://localhost/livro/testalogin.asp&amp;quot;, &amp;quot;POST&amp;quot;,strData, &amp;quot;Content-Type: application/x-www-form-urlencoded&amp;quot;&lt;br&gt;&lt;br&gt;Lembre-se que o m&amp;#233;todo execute &amp;#233; assincrono, ou seja, a aplica&amp;#231;&amp;#227;o n&amp;#227;o ir&amp;#225; parar esperando que ele seja executado. Portanto &amp;#233; necess&amp;#225;rio que voc&amp;#234; recupere a resposta do servidor atrav&amp;#233;s do m&amp;#233;todo getchunk utilizado no evento statechanged, veja :&lt;br&gt;&lt;br&gt;Private Sub Inet1_StateChanged(ByVal State As Integer)&lt;br&gt;Dim vtdata As String&lt;br&gt;Dim res As String&lt;br&gt;&lt;br&gt;If State = 12 Then&lt;br&gt;    Do&lt;br&gt;        vtdata = Inet1.GetChunk(1024, icString)&lt;br&gt;        res = res &amp;amp; vtdata&lt;br&gt;    Loop While Len(vtdata) &amp;lt;&amp;gt; 0&lt;br&gt;    Debug.Print res&lt;br&gt;End If&lt;br&gt;&lt;br&gt;End Sub</description></item></channel></rss>