Usuário com melhor resposta
(0x80004005): Erro genérico de GDI+

Pergunta
-
Olá amigo(as),
Eu estou escrevendo um programinha bem simples que monitora a temperatura do processador e exibe a temperatura a cada segundo no trayicon. A cada uma hora mais ou menos, o programa retorna erro e fecha:
System.Runtime.InteropServices.ExternalException (0x80004005): Erro genérico de GDI+.
em System.Drawing.Bitmap.GetHicon()
em WindowsApplication7.Form1.Timer1_Tick(Object sender, EventArgs e)
em System.Windows.Forms.Timer.OnTick(EventArgs e)
em System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m)
em System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)Segue o código:
Dim btmp As Bitmap = New Bitmap(16, 16) Dim g As Graphics = Graphics.FromImage(btmp) g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias Dim TempFont As Font = New Font("Arial", 9, FontStyle.Regular, GraphicsUnit.Point, 0) If rodando Then If nIconStat Then Dim clrBackColor As Color = Color.FromArgb(255, 255, 0, 0) g.Clear(clrBackColor) g.DrawString(showCurrentTemp.Text, TempFont, Brushes.Yellow, 0, 1) Else Dim clrBackColor As Color = Color.FromArgb(255, 0, 0, 255) g.Clear(clrBackColor) g.DrawString(showCurrentTemp.Text, TempFont, Brushes.White, 0, 1) End If Else Dim clrBackColor As Color = Color.FromArgb(255, 255, 255, 0) g.Clear(clrBackColor) g.DrawString(showCurrentTemp.Text, TempFont, Brushes.Blue, 0, 1) End If NotifyIcon1.Icon = Icon.FromHandle(btmp.GetHicon())
Pesquisando bastante, entendi que deveria usar o dispose pra liberar memória e adicionei estas linhas ao final:
DestroyIcon(btmp.GetHicon())
btmp.Dispose()
g.Dispose()
TempFont.Dispose()
NotifyIcon1.Icon.Dispose()
E nada resolveu, continua dando o mesmo erro, alguém pode me ajudar?
Grato desde já!
Respostas
-
Bom dia,
Por falta de retorno do usuário, esta thread será encerrada.
Caso seja necessário, por gentileza, abra uma thread nova.
Atenciosamente
Marcos Roberto de Souza Junior
Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
- Marcado como Resposta Marcos SJ segunda-feira, 21 de dezembro de 2015 12:09
Todas as Respostas
-
Boa noite,
Acredito ter encontrado a solução aqui:
Veja se ajuda em algo.
-
Olá amigo, obrigado por responder.
Então, nas minhas pesquisas pelo Google, já tinha visto esse post que mencionou e no caso dele, ele diz q tem problemas com a extensão da imagem GIF, o que não é o meu caso, já que o ícone é criado dinamicamente, cria-se um fundo de 16x16 e sobrepõe com uma fonte que mostra em números a temperatura atual.
Lembrando que o programa ta rodando que é uma beleza, mas a cada uma hora mais ou menos ele apresenta este erro e sou forçado a fecha-lo.
Mais uma vez grato pela atenção e esperando alguma ideia...
- Editado Armando Augusto sexta-feira, 11 de dezembro de 2015 00:22
-
Olá,
Caso vc crie um imagem a partir de um jpg e a partir dela criar o grafico? dessa forma, só não tive tempo de testar:
' Create image. Dim imageFile As Image = Image.FromFile("SampImag.jpg") ' Create graphics object for alteration. Dim newGraphics As Graphics = Graphics.FromImage(imageFile)
Alteraria muito o seu projeto? não facilitaria?
abç
-
Olá Don Medina,
Eu tentei fazer da forma como citou e falhei miseravelmente quando ponho pra aparecer o texto mostrando os graus de temperatura no ícone da bandeja. Na verdade já havia tentado antes de desenhar dinamicamente.
Por ser um programa particular, apenas pra estudo mesmo, não vou insistir muito. Fiz uma gambiarra fazendo com que qndo ele der erro, ele abra uma nova instancia e feche a antiga.
Vou continuar pesquisando, caso encontre solução volto aqui com certeza pra postar o resultado e se alguém tiver uma ideia posta ae fazendo o favor :)
Vlw a força Don, abraços.
-
Siga as instruções abaixo para ver se consegue resolver o problema:
Destroy the icon
<System.Runtime.InteropServices.DllImportAttribute("user32.dll")> _ Private Shared Function DestroyIcon(ByVal handle _ As IntPtr) As Boolean End Function Private Sub GetHicon_Example(ByVal e As PaintEventArgs)
Create a Bitmap object from an image file.
Dim myBitmap As New Bitmap("c:\FakePhoto.jpg")
Draw myBitmap to the screen.
e.Graphics.DrawImage(myBitmap, 0, 0)
Get an Hicon for myBitmap.
Dim HIcon As IntPtr = myBitmap.GetHicon()
Create a new icon from the handle.
Dim newIcon As Icon = System.Drawing.Icon.FromHandle(HIcon)
Set the form Icon attribute to the new icon.
Me.Icon = newIcon
You can now destroy the icon, since the form creates its
own copy of the icon accessible through the Form.Icon property. DestroyIcon(newIcon.Handle) End Sub
Espero ter ajudado.
Atenciosamente
Marcos Roberto de Souza Junior
Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
-
Bom dia,
Por falta de retorno do usuário, esta thread será encerrada.
Caso seja necessário, por gentileza, abra uma thread nova.
Atenciosamente
Marcos Roberto de Souza Junior
Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
- Marcado como Resposta Marcos SJ segunda-feira, 21 de dezembro de 2015 12:09