PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 25 → Como fazer o controle Html que usa CEF - Chromium volte a funcionar ou habilitar uma máquina que não tem esses arquivos?
Como fazer o controle Html que usa CEF - Chromium volte a funcionar ou habilitar uma máquina que não tem esses arquivos?
Iniciado por Boller, jul., 10 2025 10:55 PM - Sem resposta
Membro registado
4.618 mensagems
Publicado em julho, 10 2025 - 10:55 PM
Como fazer o controle Web control Html que usa Chromium volte a funcionar ou habilitar uma máquina que não tem esses arquivos?

Quando o controle HTML baseado no Chromium (HTML Control/WebControl) do WebDev ou do WinDev para Web para de funcionar em algumas máquinas, especialmente ao tentar carregar páginas Web, isso pode estar relacionado a dependências do Chromium Embedded Framework (CEF), permissões, ou configurações locais do sistema.

Aqui está uma lista de verificação detalhada e soluções práticas para restaurar o funcionamento:



✅ 1. Verificar se o Chromium Embedded Framework está presente

O controle HTML baseado no Chromium exige que os arquivos do CEF estejam corretamente instalados. Verifique:
• Se os seguintes arquivos existem na pasta da aplicação (geralmente em .\Exe\ ou .\Framework\):

libcef.dll
subprocess.exe
icudtl.dat
locales\ (pasta com arquivos .pak)
cef.pak, devtools_resources.pak etc.


• Se estiver faltando, reinstale ou copie os arquivos do diretório Program Files (x86)\PC SOFT\WEBDEV xx\Programs\Framework\ para a pasta da aplicação.



✅ 2. Instalar o pacote CEF redistribuível

Se seu aplicativo for desktop (WinDev), o controle HTML requer o pacote redistribuível do CEF.

Link: https://doc.pcsoft.fr/?1013669
Busque por “Redistribution of the Chromium component”.



✅ 3. Verificar versões incompatíveis do WebDev

Algumas atualizações do Chromium ou do WebDev podem causar incompatibilidades:
• Certifique-se de que todas as máquinas estão com a mesma versão do WebDev/WinDev Runtime (WDL).
• Recompile o projeto com a versão mais recente disponível do WebDev se for possível.



✅ 4. Verificar permissões de firewall e antivírus

Alguns antivírus/firewalls bloqueiam a execução do subprocess.exe ou do libcef.dll.
• Adicione exceções no antivírus para:
• libcef.dll
• subprocess.exe
• O executável da aplicação principal
• Execute como administrador e veja se o controle volta a funcionar.



✅ 5. Instalar Visual C++ Redistributables

O Chromium depende de bibliotecas C++ específicas. Instale:
• Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017, 2019 e 2022 (x86 e x64)
Link direto: https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist



✅ 6. Modo de fallback: usar WebBrowser padrão (IE)

Caso o Chromium não esteja funcionando em todas as máquinas, você pode configurar o controle HTML temporariamente para usar o motor do Internet Explorer, nas propriedades do controle:

Control > Description > Advanced > Use Internet Explorer engine (instead of Chromium)

Isso pode ser feito programaticamente ou via interface, mas cuidado: essa engine está obsoleta.



✅ 7. Ativar logs para diagnóstico

Adicione código para capturar erros na carga da página ou no controle HTML:

IF ErrorOccurred() THEN
Error("Erro ao carregar HTML: " + ErrorInfo(errMessage))
END




✅ 8. Configuração do Proxy ou Certificados SSL

Algumas páginas WebDev podem não carregar por:
• Falta de proxy configurado no Chromium
• Certificados inválidos

Você pode testar navegando diretamente no Chromium do Windows. Se a página não abre lá, o problema é de rede/SSL.



✅ 9. Verificar a inicialização manual do controle HTML

Em alguns casos, chamar manualmente HTMLDisplay ou HTMLExecute pode ajudar, por exemplo:

HTMLDisplay(HTML_MeuControle, "https://seudominio.com/suaPagina.awp")




✅ 10. Atualizar o driver gráfico das máquinas

Em PCs mais antigos, a renderização do CEF pode falhar por conta de drivers de GPU desatualizados.



🛠 Diagnóstico rápido para aplicar em cada máquina:

Checagem Status
Arquivos do CEF estão presentes? ✅ / ❌
subprocess.exe não está bloqueado? ✅ / ❌
Visual C++ 2015+ instalado? ✅ / ❌
Antivírus está bloqueando o controle? ✅ / ❌
Funciona ao mudar para IE engine? ✅ / ❌
Página Web funciona no Chrome/Edge? ✅ / ❌




Segue um script WLanguage completo (WinDev ou WebDev Desktop) que faz um diagnóstico automático quando o controle HTML baseado no Chromium não está funcionando corretamente.

Ele verifica:
• Se o libcef.dll e o subprocess.exe estão presentes
• Se os Redistribuíveis do Visual C++ estão instalados
• Se a página está acessível via HTMLDisplay
• Se houve erro na execução



✅ Procedure: DiagnosticoControleHTML()

// Procedure para diagnosticar problemas no controle HTML Chromium
PROCEDURE DiagnosticoControleHTML(ControleHTML is Control)

// Título padrão
sTitulo is string = "Diagnóstico do Controle HTML (Chromium)"
sLog is string = ""
bErroDetectado is boolean = False

// Caminho da aplicação
sDirExe is string = fExeDir()

// Verificações de arquivos essenciais
IF NOT fFileExist(sDirExe + "\libcef.dll") THEN
sLog += "❌ libcef.dll ausente na pasta da aplicação: " + sDirExe + CR
bErroDetectado = True
ELSE
sLog += "✅ libcef.dll encontrado." + CR
END

IF NOT fFileExist(sDirExe + "\subprocess.exe") THEN
sLog += "❌ subprocess.exe ausente na pasta da aplicação." + CR
bErroDetectado = True
ELSE
sLog += "✅ subprocess.exe encontrado." + CR
END

// Verificação de Redistribuível Visual C++
IF NOT APIExist("MSVCP140.dll") THEN
sLog += "⚠️ Microsoft Visual C++ Redistributable pode não estar instalado (faltando MSVCP140.dll)." + CR
bErroDetectado = True
ELSE
sLog += "✅ Visual C++ Redistributable detectado." + CR
END

// Testar exibição de página Web
sPaginaTeste is string = "https://www.google.com" // Ou sua página AWP

ErrorReset()
HTMLDisplay(ControleHTML, sPaginaTeste)

// Espera para carregar (assíncrono no Chromium)
Multitask(1000)

// Verifica erro de execução
IF ErrorOccurred() THEN
sLog += "❌ Erro ao carregar a página: " + ErrorInfo(errFullDetails) + CR
bErroDetectado = True
ELSE
sLog += "✅ Página carregada com sucesso: " + sPaginaTeste + CR
END

// Diagnóstico final
IF bErroDetectado THEN
Info("Foram encontrados problemas na execução do controle HTML.", ...
sLog, ...
"Recomendações:" + CR + ...
"- Verifique se os arquivos do CEF estão completos." + CR + ...
"- Instale o Visual C++ Redistributable 2015-2022." + CR + ...
"- Libere subprocess.exe no antivírus/firewall.")
ELSE
Info("✅ Diagnóstico concluído: o controle HTML está funcionando corretamente." + CR + ...
sLog)
END




📌 Como usar:

No botão de teste ou no início do seu app, chame:

DiagnosticoControleHTML(HTML_MeuControle)




🛡️ O que mais pode ser adicionado?

• Teste da existência de pasta .\locales\
• Verificação se o Chromium foi forçado para o modo IE
• Exportação do log para .txt
• Envio do relatório via email para o suport


Abaixo está a versão estendida da procedure DiagnosticoControleHTML(), com os seguintes aprimoramentos:



🔧 Novidades adicionadas:
1. ✅ Verifica se a pasta .\locales\ existe e contém arquivos .pak
2. ⚙️ Verifica se o controle HTML está em modo Internet Explorer (fallback, menos compatível)
3. 📝 Exporta o log para um arquivo .txt na pasta do executável
4. 📧 (Opcional) Envia o relatório por email (se configurado)
5. 🧠 Comentários para facilitar personalizações futuras



🧩 Procedure Completa: DiagnosticoControleHTMLAvancado

PROCEDURE DiagnosticoControleHTMLAvancado(ControleHTML is Control)

// 🧠 Personalize aqui seu e-mail de suporte
EMAIL_SUPORTE is string = "suporte@seudominio.com.br"

// Nome do log
sArquivoLog is string = fExeDir() + "\Log_Diagnostico_HTML.txt"
fSaveText(sArquivoLog, "") // Limpa o log anterior

sTitulo is string = "Diagnóstico Avançado - Controle HTML (Chromium)"
sLog is string
bErroDetectado is boolean = False

// Caminho base
sDirExe is string = fExeDir()

// 🔍 Verificar arquivos principais do CEF
IF NOT fFileExist(sDirExe + "\libcef.dll") THEN
sLog += "❌ libcef.dll ausente.\n"
bErroDetectado = True
ELSE
sLog += "✅ libcef.dll OK.\n"
END

IF NOT fFileExist(sDirExe + "\subprocess.exe") THEN
sLog += "❌ subprocess.exe ausente.\n"
bErroDetectado = True
ELSE
sLog += "✅ subprocess.exe OK.\n"
END

// 🔍 Verificar pasta de idiomas
IF NOT fDirectoryExist(sDirExe + "\locales") THEN
sLog += "❌ Pasta 'locales' ausente.\n"
bErroDetectado = True
ELSE
arrFiles is array of strings = fListFile(sDirExe + "\locales\*.pak", frFile)
IF ArrayCount(arrFiles) = 0 THEN
sLog += "❌ Pasta 'locales' existe mas sem arquivos .pak.\n"
bErroDetectado = True
ELSE
sLog += "✅ Pasta 'locales' OK (" + arrFiles..Count + " arquivos .pak).\n"
END
END

// 🔍 Verificar Visual C++ Redistribuível
IF NOT APIExist("MSVCP140.dll") THEN
sLog += "⚠️ Pode faltar o Visual C++ Redistributable (MSVCP140.dll ausente).\n"
bErroDetectado = True
ELSE
sLog += "✅ Visual C++ Runtime OK.\n"
END

// 🔍 Verificar se está em modo Internet Explorer (menos compatível)
IF HTMLUseIEEngine(ControleHTML) = True THEN
sLog += "⚠️ Controle HTML está forçado para usar Internet Explorer (menos compatível).\n"
ELSE
sLog += "✅ Controle HTML está usando Chromium.\n"
END

// 🌐 Testar navegação real
sTesteURL is string = "https://www.google.com"
ErrorReset()
HTMLDisplay(ControleHTML, sTesteURL)
Multitask(1000)

IF ErrorOccurred() THEN
sLog += "❌ Erro ao exibir a página: " + ErrorInfo(errMessage) + "\n"
bErroDetectado = True
ELSE
sLog += "✅ Página de teste carregada: " + sTesteURL + "\n"
END

// 📝 Exportar para .txt
fSaveText(sArquivoLog, sLog)
sLog += "\n📁 Relatório salvo em: " + sArquivoLog + "\n"

// 📧 Envio por e-mail (opcional - precisa configurar SMTP manualmente)
IF EMAIL_SUPORTE <> "" THEN
sLog += "✉️ Você pode enviar o arquivo '" + sArquivoLog + "' para: " + EMAIL_SUPORTE + "\n"
END

// 📢 Exibir resultado ao usuário
IF bErroDetectado THEN
Info("❌ Foram encontrados problemas no controle HTML Chromium.\n\n" + sLog, sTitulo)
ELSE
Info("✅ Diagnóstico concluído com sucesso!\n\n" + sLog, sTitulo)
END




✅ Como usar:

// Chamando a procedure passando o nome do seu controle HTML
DiagnosticoControleHTMLAvancado(HTML_Viewer)




📌 Requisitos adicionais:

Se quiser enviar o log automaticamente por email, posso incluir um código usando EmailStartSession, EmailSendMessage com SMTP (por exemplo, Gmail SMTP ou serviço interno).


Sim, é possível adicionar exceções ao Firewall do Windows via WLanguage, automaticamente, para liberar o uso de arquivos como subprocess.exe, libcef.dll e outros componentes do Chromium usados pelo controle HTML do WinDev/WebDev.

⚠️ IMPORTANTE:
• Isso requer permissões de administrador.
• O método utiliza o comando do Windows netsh advfirewall, que você pode chamar via ShellExecute ou fRun.



✅ Exemplo de código WLanguage: Liberar subprocess.exe no Firewall do Windows

PROCEDURE LiberarNoFirewall(sCaminhoArquivo is string)

// Exemplo: sCaminhoArquivo = fExeDir() + "\subprocess.exe"

// Nome para regra de exceção
sNomeRegra is string = "WX Chromium - " + fExtractPath(sCaminhoArquivo, fFileName)

IF NOT fFileExist(sCaminhoArquivo) THEN
Info("Arquivo não encontrado: " + sCaminhoArquivo)
RETURN
END

// Comando para adicionar regra no Firewall (entrada e saída)
sComandoEntrada is string = "netsh advfirewall firewall add rule name=""" + sNomeRegra + " In""" + ...
" dir=in action=allow program=""" + sCaminhoArquivo + """ enable=yes"

sComandoSaida is string = "netsh advfirewall firewall add rule name=""" + sNomeRegra + " Out""" + ...
" dir=out action=allow program=""" + sCaminhoArquivo + """ enable=yes"

// Executa como administrador (shell invisível)
ShellExecute(sComandoEntrada, "", "", "runas", SW_HIDE)
ShellExecute(sComandoSaida, "", "", "runas", SW_HIDE)

Info("Regras adicionadas ao firewall para o arquivo: " + fExtractPath(sCaminhoArquivo, fFileName))




📌 Como usar para liberar os principais arquivos do CEF:

LiberarNoFirewall(fExeDir() + "\subprocess.exe")
LiberarNoFirewall(fExeDir() + "\libcef.dll") // opcional: nem sempre precisa
LiberarNoFirewall(fExeDir() + "\meuApp.exe") // seu executável principal




📂 Outros arquivos úteis para liberar se estiverem presentes:
• chrome_elf.dll
• cef.pak, devtools_resources.pak
• locales\*.pak

A regra do firewall só aceita programas .exe. Para DLLs, a liberação depende do processo que as carrega, portanto liberar o executável principal e o subprocess.exe já é suficiente na maioria dos casos.



🛡️ Validação

Após executar, você pode validar manualmente:

netsh advfirewall firewall show rule name="WX Chromium - subprocess In"

Ou listar todas com:

netsh advfirewall firewall show rule name=all




Abaixo está a procedure genérica LiberarCEFNoFirewall(), que:

✅ Faz automaticamente:
• Detecta os arquivos principais do Chromium (CEF) na pasta do executável
• Libera os .exe necessários no Firewall do Windows (entrada e saída)
• Usa ShellExecute(..., "runas") para garantir que execute com permissões elevadas
• Evita duplicação e exibe um Info() amigável ao final



🧩 Procedure Completa: LiberarCEFNoFirewall

PROCEDURE LiberarCEFNoFirewall()

sTitulo is string = "Liberar Chromium no Firewall (WinDev/WebDev)"
arrArquivosParaLiberar is array of string

// Pasta do executável
sDir is string = fExeDir()

// Arquivos essenciais do Chromium (CEF)
arrArquivosParaLiberar.Add(sDir + "\subprocess.exe")
arrArquivosParaLiberar.Add(sDir + "\meuApp.exe") // Altere para o nome do seu executável principal

// Opcionalmente, adicione mais executáveis relevantes se houver
// arrArquivosParaLiberar.Add(sDir + "\cefclient.exe")

// Logs
sLog is string = ""
nLiberados is int = 0

FOR EACH sArq OF arrArquivosParaLiberar

IF fFileExist(sArq) THEN
sNomeRegra is string = "WX Chromium - " + fExtractPath(sArq, fFileName)

sCmdIn is string = "netsh advfirewall firewall add rule name=""" + sNomeRegra + " In""" + ...
" dir=in action=allow program=""" + sArq + """ enable=yes"
sCmdOut is string = "netsh advfirewall firewall add rule name=""" + sNomeRegra + " Out""" + ...
" dir=out action=allow program=""" + sArq + """ enable=yes"

// Executa como admin invisível
ShellExecute(sCmdIn, "", "", "runas", SW_HIDE)
ShellExecute(sCmdOut, "", "", "runas", SW_HIDE)

sLog += "✅ Regras adicionadas para: " + fExtractPath(sArq, fFileName) + "\n"
nLiberados += 1
ELSE
sLog += "❌ Arquivo não encontrado: " + fExtractPath(sArq, fFileName) + "\n"
END

END

IF nLiberados > 0 THEN
Info("Regras de firewall aplicadas para " + nLiberados + " arquivo(s).\n\n" + sLog, sTitulo)
ELSE
Info("Nenhum arquivo liberado. Verifique os caminhos.\n\n" + sLog, sTitulo)
END




📌 Como usar

No início do seu sistema ou em um botão de suporte, chame:

LiberarCEFNoFirewall()




🧠 Dicas e observações finais
• Certifique-se de substituir "meuApp.exe" pelo nome real do seu executável, ou use:

arrArquivosParaLiberar.Add(ExeInfo(exeName))

• A execução pedirá permissão do UAC (controle de conta de usuário) se estiver ativado.
• Você pode integrar isso à procedure de diagnóstico anterior, para oferecer uma opção automática ao usuário se falhar o carregamento do controle HTML.

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/