PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 25 → Dados do HD
Dados do HD
Débuté par Boller, 26 sep. 2024 04:17 - 5 réponses
Membre enregistré
3 703 messages
Popularité : +175 (223 votes)
Posté le 26 septembre 2024 - 04:17
Vou criar uma procedure em WLanguage que verifica as informações do HD (serial, tamanho total, espaço usado e livre) de uma unidade de disco passada como parâmetro. A procedure irá retornar essas informações em um array. Aqui está o código:

```wlanguage
//##############################
// Procedure para verificar informações de uma unidade de disco
PROCEDURE CheckDiskInfo(driveLetter is string)

// Declaração de variáveis
diskInfoArray is array of string
totalSpace is real
freeSpace is real
usedSpace is real
serialNumber is string

// Obtendo o número serial do disco
serialNumber = SysSerialNumber(driveLetter)
IF serialNumber = "" THEN
RETURN "Erro: Unidade de disco não encontrada"
END

// Obtendo o espaço total e livre do disco
totalSpace = SysSpace(driveLetter, ssTotal)
freeSpace = SysSpace(driveLetter, ssFree)
usedSpace = totalSpace - freeSpace

// Preenchendo o array com as informações
diskInfoArray[1] = "Serial Number: " + serialNumber
diskInfoArray[2] = "Total Space: " + NumToString(totalSpace, "*.* GBytes")
diskInfoArray[3] = "Used Space: " + NumToString(usedSpace, "*.* GBytes")
diskInfoArray[4] = "Free Space: " + NumToString(freeSpace, "*.* GBytes")

// Retornando o array com as informações
RESULT diskInfoArray
//##############################
```

### Explicação do código:
1. **`SysSerialNumber(driveLetter)`**: Retorna o número serial da unidade de disco passada como parâmetro. Se não houver unidade, retorna uma mensagem de erro.
2. **`SysSpace(driveLetter, ssTotal)`** e **`SysSpace(driveLetter, ssFree)`**: Essas funções pegam o espaço total e o espaço livre da unidade de disco, respectivamente.
3. **Array**: Armazena o número serial, o espaço total, o espaço usado e o espaço livre no array `diskInfoArray`.
4. **`NumToString`**: Formata os números para exibir os valores em GBytes.

### Como usar:
Para chamar a procedure e verificar a unidade "C:", por exemplo, você pode fazer assim:

```wlanguage
myDiskInfo is array of string = CheckDiskInfo("C:")
FOR EACH info OF myDiskInfo
Trace(info)
END
```

Esse código exibirá as informações no **Trace**, como o número serial, o espaço total, o espaço usado e o espaço livre da unidade de disco.

Se precisar de mais alguma coisa ou ajuste, só avisar!


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Message modifié, 26 septembre 2024 - 04:21
Membre enregistré
3 703 messages
Popularité : +175 (223 votes)
Posté le 26 septembre 2024 - 04:23
Aqui está a procedure em WLanguage que detecta a quantidade total de memória, paginação, memória usada e memória livre do sistema, retornando essas informações em um array:

```wlanguage
//##############################
// Procedure para verificar informações da memória
PROCEDURE CheckMemoryInfo()

// Declaração de variáveis
memoryInfoArray is array of string
totalMemory is real
usedMemory is real
freeMemory is real
pagingFileTotal is real
pagingFileUsed is real
pagingFileFree is real

// Obtendo a memória total e livre
totalMemory = SysSpace(SysMemory, ssTotal)
freeMemory = SysSpace(SysMemory, ssFree)
usedMemory = totalMemory - freeMemory

// Obtendo informações sobre o arquivo de paginação (pagefile)
pagingFileTotal = SysSpace(SysPagingFile, ssTotal)
pagingFileFree = SysSpace(SysPagingFile, ssFree)
pagingFileUsed = pagingFileTotal - pagingFileFree

// Preenchendo o array com as informações de memória
memoryInfoArray[1] = "Total Memory: " + NumToString(totalMemory, "*.* GBytes")
memoryInfoArray[2] = "Used Memory: " + NumToString(usedMemory, "*.* GBytes")
memoryInfoArray[3] = "Free Memory: " + NumToString(freeMemory, "*.* GBytes")
memoryInfoArray[4] = "Total Paging File: " + NumToString(pagingFileTotal, "*.* GBytes")
memoryInfoArray[5] = "Used Paging File: " + NumToString(pagingFileUsed, "*.* GBytes")
memoryInfoArray[6] = "Free Paging File: " + NumToString(pagingFileFree, "*.* GBytes")

// Retornando o array com as informações
RESULT memoryInfoArray
//##############################
```

### Explicação do código:
1. **`SysSpace(SysMemory, ssTotal)`**: Retorna a quantidade total de memória física disponível no sistema.
2. **`SysSpace(SysMemory, ssFree)`**: Retorna a quantidade de memória livre disponível no sistema.
3. **Cálculo da memória usada**: Subtraímos a memória livre da memória total para obter a memória usada.
4. **`SysSpace(SysPagingFile, ssTotal)`**: Retorna o tamanho total do arquivo de paginação (memória virtual).
5. **`SysSpace(SysPagingFile, ssFree)`**: Retorna o espaço livre disponível no arquivo de paginação.
6. **Array**: Armazena a memória total, memória usada, memória livre, tamanho total do arquivo de paginação, tamanho usado e tamanho livre do arquivo de paginação.

### Como usar:
Você pode chamar essa procedure e obter as informações da memória do sistema assim:

```wlanguage
myMemoryInfo is array of string = CheckMemoryInfo()
FOR EACH info OF myMemoryInfo
Trace(info)
END
```

Esse código exibirá as informações de memória no **Trace**, incluindo a quantidade total de memória, memória usada, memória livre e as informações sobre o arquivo de paginação.

Se precisar de ajustes ou tiver outra questão, é só me avisar!


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membre enregistré
3 703 messages
Popularité : +175 (223 votes)
Posté le 26 septembre 2024 - 04:29
Para obter o uso e a temperatura da CPU em WLanguage, precisamos acessar informações do sistema que não são diretamente fornecidas pelas funções internas do WLanguage. Porém, você pode usar comandos do sistema operacional para capturar essas informações. Vamos supor que estamos em um ambiente Windows e usamos o **WMI** (Windows Management Instrumentation) para obter o uso e a temperatura da CPU via comando externo.

Aqui está a procedure que utiliza comandos para obter essas informações e retornar em um array:

```wlanguage
//##############################
// Procedure para verificar uso e temperatura da CPU
PROCEDURE CheckCPUInfo()

// Declaração de variáveis
cpuInfoArray is array of string
cpuUsage is real
cpuTemperature is real

// Comando para obter o uso da CPU (percentual)
USE_CPU is string = "wmic cpu get loadpercentage"
ResUso is string = fExecuteExternal(USE_CPU, fWaitResult)
IF ResUso ~= "" THEN
cpuUsage = Val(ExtractString(ResUso, 2)) // Extraímos o valor da segunda linha da resposta
ELSE
RETURN "Erro: Não foi possível obter o uso da CPU"
END

// Comando para obter a temperatura da CPU
USE_TEMP is string = "wmic /namespace:\\root\wmi PATH MSAcpi_ThermalZoneTemperature get CurrentTemperature"
ResTemp is string = fExecuteExternal(USE_TEMP, fWaitResult)
IF ResTemp ~= "" THEN
// O valor de temperatura retornado pelo WMI está em unidades de 1/10 Kelvin
cpuTemperature = (Val(ExtractString(ResTemp, 2)) / 10) - 273.15 // Convertendo de Kelvin para Celsius
ELSE
RETURN "Erro: Não foi possível obter a temperatura da CPU"
END

// Preenchendo o array com as informações
cpuInfoArray[1] = "CPU Usage: " + NumToString(cpuUsage, "*.*") + "%"
cpuInfoArray[2] = "CPU Temperature: " + NumToString(cpuTemperature, "*.*") + " °C"

// Retornando o array com as informações
RESULT cpuInfoArray
//##############################
```

### Explicação do código:
1. **`fExecuteExternal()`**: Executa comandos do sistema e retorna os resultados. No primeiro comando, usamos **WMI** para obter a porcentagem de uso da CPU e no segundo comando para obter a temperatura da CPU.
2. **`ExtractString(ResUso, 2)`**: Extrai a segunda linha da saída do comando, que contém o valor de uso da CPU.
3. **Conversão da temperatura**: A temperatura retornada pelo **WMIC** está em Kelvin multiplicado por 10. Para converter isso em Celsius, usamos a fórmula `(Valor / 10) - 273.15`.
4. **Array**: O array `cpuInfoArray` armazena as informações de uso da CPU e temperatura, que serão retornadas no final da procedure.

### Como usar:
Você pode chamar essa procedure e exibir as informações da CPU assim:

```wlanguage
myCPUInfo is array of string = CheckCPUInfo()
FOR EACH info OF myCPUInfo
Trace(info)
END
```

Esse código exibirá o uso da CPU em porcentagem e a temperatura em graus Celsius.

### Nota:
- Esse exemplo usa o **WMIC** que está disponível em versões do Windows, mas o **WMIC** foi descontinuado em versões mais recentes do Windows 10 e Windows 11. Nesse caso, você pode precisar utilizar outras ferramentas para obter a temperatura e uso da CPU, como PowerShell ou APIs específicas do Windows.

Se precisar de mais alguma coisa ou ajuste, só avisar!


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membre enregistré
3 703 messages
Popularité : +175 (223 votes)
Posté le 26 septembre 2024 - 04:31
Para computadores com multi CPUs

Caso o sistema tenha mais de um processador (como 4 processadores, por exemplo), você precisará modificar a procedure para coletar o uso e a temperatura de cada um separadamente e retornar as informações de todos os processadores. O **WMIC** já suporta múltiplos processadores e retornará os dados de todos eles. Precisamos então iterar sobre os resultados e armazenar cada uso e temperatura em arrays separados.

Aqui está a procedure atualizada para lidar com múltiplos processadores:

```wlanguage
//##############################
// Procedure para verificar uso e temperatura de múltiplos processadores
PROCEDURE CheckMultiCPUInfo()

// Declaração de variáveis
cpuInfoArray is array of string
cpuUsageArray is array of real
cpuTempArray is array of real
cpuCount is int

// Comando para obter o uso da CPU (percentual)
USE_CPU is string = "wmic cpu get loadpercentage"
ResUso is string = fExecuteExternal(USE_CPU, fWaitResult)
IF ResUso ~= "" THEN
// Extrair as linhas de resultado, removendo as linhas vazias
arrUsage is array of string = StringToArray(ResUso, CR) // Quebrar as linhas de resultado
cpuCount = ArrayCount(arrUsage) - 1 // Subtrai 1 para excluir o cabeçalho
FOR i = 2 TO cpuCount + 1 // Começa da segunda linha, pois a primeira é o cabeçalho
cpuUsageArray[i-1] = Val(arrUsage[i])
END
ELSE
RETURN "Erro: Não foi possível obter o uso da CPU"
END

// Comando para obter a temperatura da CPU
USE_TEMP is string = "wmic /namespace:\\root\wmi PATH MSAcpi_ThermalZoneTemperature get CurrentTemperature"
ResTemp is string = fExecuteExternal(USE_TEMP, fWaitResult)
IF ResTemp ~= "" THEN
// O valor de temperatura retornado pelo WMI está em unidades de 1/10 Kelvin
arrTemp is array of string = StringToArray(ResTemp, CR) // Quebrar as linhas de resultado
FOR i = 2 TO ArrayCount(arrTemp)
cpuTempArray[i-1] = (Val(arrTemp[i]) / 10) - 273.15 // Convertendo de Kelvin para Celsius
END
ELSE
RETURN "Erro: Não foi possível obter a temperatura da CPU"
END

// Preenchendo o array com as informações de todos os processadores
FOR i = 1 TO cpuCount
cpuInfoArray[i] = "CPU " + NumToString(i) + ": Usage = " + NumToString(cpuUsageArray[i], "*.*") + "%, Temperature = " + NumToString(cpuTempArray[i], "*.*") + " °C"
END

// Retornando o array com as informações
RESULT cpuInfoArray
//##############################
```

### Explicação do código atualizado:
1. **Uso da CPU para múltiplos processadores**: O comando `wmic cpu get loadpercentage` retorna o uso para todos os processadores. Nós utilizamos a função `StringToArray()` para dividir o resultado em linhas e então iterar sobre cada linha para extrair os valores de uso de CPU para cada processador.
2. **Temperatura da CPU para múltiplos processadores**: O comando `wmic /namespace:\\root\wmi PATH MSAcpi_ThermalZoneTemperature get CurrentTemperature` retorna a temperatura para todas as zonas térmicas (cada processador). Nós convertemos os valores de Kelvin para Celsius e os armazenamos no array `cpuTempArray`.
3. **Loop para adicionar as informações ao array**: O array `cpuInfoArray` é preenchido com as informações de uso e temperatura de cada processador, formatando uma string para cada CPU.

### Como usar:
Você pode chamar essa procedure e exibir as informações de todos os processadores assim:

```wlanguage
myMultiCPUInfo is array of string = CheckMultiCPUInfo()
FOR EACH info OF myMultiCPUInfo
Trace(info)
END
```

Isso exibirá o uso e a temperatura de cada CPU no **Trace**, organizando as informações em uma lista.

### Nota:
- **WMIC** retorna informações de todos os processadores, e este código garante que os dados sejam processados corretamente.
- Caso a saída do **WMIC** não inclua todas as temperaturas ou se houver problemas de leitura em máquinas específicas, pode ser necessário ajustar a forma de obtenção da temperatura para sistemas mais recentes ou específicos.

Se precisar de mais ajustes, só avisar!


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membre enregistré
3 703 messages
Popularité : +175 (223 votes)
Posté le 26 septembre 2024 - 04:36
Sim, é possível monitorar a porcentagem de uso da rede em WLanguage utilizando comandos externos do sistema operacional para acessar informações da interface de rede. No caso de ambientes Windows, podemos utilizar o **WMIC** ou **PowerShell** para obter informações de tráfego de rede e calcular a porcentagem de uso baseada na capacidade máxima da interface de rede.

Aqui está uma abordagem em WLanguage usando **PowerShell** para capturar a taxa de envio e recebimento de dados na interface de rede e calcular a porcentagem de uso. A taxa de uso é calculada comparando o tráfego atual com a capacidade máxima da interface.

### Procedure para monitorar o uso da rede:

```wlanguage
//##############################
// Procedure para monitorar o uso da rede
PROCEDURE CheckNetworkUsage()

// Declaração de variáveis
networkInfoArray is array of string
networkUsage is real
networkCapacity is real = 100.0 // Capacidade máxima da interface de rede (em Mbit/s), ajustar conforme necessário
receivedBytes is real
sentBytes is real
totalUsage is real

// Comando PowerShell para obter as estatísticas de rede
COMMAND is string = "powershell -Command ""Get-NetAdapterStatistics | Select-Object ReceivedBytes, SentBytes"""
ResNet is string = fExecuteExternal(COMMAND, fWaitResult)
IF ResNet ~= "" THEN
// Extraímos os valores de bytes recebidos e enviados
arrNetStats is array of string = StringToArray(ResNet, CR)
receivedBytes = Val(ExtractString(arrNetStats[2], 1))
sentBytes = Val(ExtractString(arrNetStats[2], 2))

// Convertendo bytes para megabits (8 bits por byte e dividido por 1 milhão)
receivedMbits = (receivedBytes * 8) / 1000000
sentMbits = (sentBytes * 8) / 1000000

// Calculando o total de uso da rede
totalUsage = receivedMbits + sentMbits

// Calculando a porcentagem de uso em relação à capacidade máxima da rede
networkUsage = (totalUsage / networkCapacity) * 100
ELSE
RETURN "Erro: Não foi possível obter os dados da rede"
END

// Preenchendo o array com as informações
networkInfoArray[1] = "Total Received (Mbits): " + NumToString(receivedMbits, "*.*")
networkInfoArray[2] = "Total Sent (Mbits): " + NumToString(sentMbits, "*.*")
networkInfoArray[3] = "Network Usage: " + NumToString(networkUsage, "*.*") + "%"

// Retornando o array com as informações
RESULT networkInfoArray
//##############################
```

### Explicação do código:
1. **Comando PowerShell**: Usamos o comando `Get-NetAdapterStatistics` que retorna o número de bytes recebidos e enviados em cada adaptador de rede.
2. **Conversão de bytes para megabits**: Como estamos interessados na taxa de transferência em megabits por segundo (Mbit/s), multiplicamos o número de bytes por 8 (bits por byte) e depois dividimos por 1 milhão para converter para megabits.
3. **Capacidade da rede**: A variável `networkCapacity` representa a capacidade máxima da interface de rede. Você pode ajustar isso com base na capacidade da sua interface (ex: 100 Mbit/s, 1 Gbit/s, etc.).
4. **Cálculo da porcentagem de uso**: A porcentagem de uso da rede é calculada comparando a taxa de uso atual (somatório de bytes recebidos e enviados) com a capacidade máxima da interface.

### Como usar:
Você pode chamar essa procedure e obter as informações sobre o uso da rede assim:

```wlanguage
myNetworkInfo is array of string = CheckNetworkUsage()
FOR EACH info OF myNetworkInfo
Trace(info)
END
```

Isso exibirá a quantidade de dados recebidos e enviados (em Mbit) e a porcentagem de uso da rede no **Trace**.

### Nota:
- **Capacidade da interface de rede**: A variável `networkCapacity` deve ser ajustada conforme a velocidade máxima da interface de rede (por exemplo, 100 Mbit/s ou 1 Gbit/s).
- **PowerShell**: Esta solução depende do **PowerShell** para obter as estatísticas de rede. Caso sua interface ou sistema tenha uma forma específica de monitorar isso, o comando pode ser ajustado.
- Para um monitoramento contínuo, essa procedure pode ser chamada periodicamente e os valores podem ser comparados para calcular a taxa de transferência ao longo do tempo.

Se precisar de mais ajustes ou outra abordagem, só avisar!


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membre enregistré
3 703 messages
Popularité : +175 (223 votes)
Posté le 26 septembre 2024 - 04:43
Vamos melhorar o exemplo anterior utilizando passagem de parâmetros na procedure, além de recursos mais modernos disponíveis na versão 29 do WinDev. Isso permitirá que a procedure seja mais flexível e reutilizável.

### Procedure com passagem de parâmetros e recursos da versão 29:

Na versão 29, temos melhorias na segurança e na codificação de mensagens. Vamos passar os seguintes parâmetros para a procedure:
- **SMTP server**: endereço do servidor SMTP.
- **Port**: porta usada para o envio (587 para TLS).
- **Sender email**: o e-mail do remetente.
- **Password**: senha do e-mail do remetente.
- **Recipient email**: e-mail do destinatário.
- **Subject**: assunto do e-mail.
- **Message**: corpo da mensagem.

Aqui está a procedure atualizada:

```wlanguage
//##############################
// Procedure para enviar e-mail com passagem de parâmetros e recursos da versão 29
PROCEDURE SendEmailWithParams(smtpServer is string, smtpPort is int, senderEmail is string, password is string, recipientEmail is string, subject is string, messageText is string)

// Declaração de variáveis para a configuração do SMTP
smtpSession is EmailSMTPSession
smtpSession.ServerAddress = smtpServer // Endereço do servidor SMTP
smtpSession.Name = senderEmail // E-mail do remetente
smtpSession.Password = password // Senha do e-mail
smtpSession.Port = smtpPort // Porta SMTP (padrão 587 para TLS)
smtpSession.Option = emailOptionSecuredTLS // Usar TLS para criptografia (mais seguro)

// Iniciar a sessão SMTP
IF NOT EmailStartSMTPSession(smtpSession) THEN
Error("Erro ao iniciar a sessão SMTP: ", ErrorInfo(errMessage))
RETURN
END

// Configurando a mensagem de e-mail
emailMessage is Email
emailMessage.Sender = senderEmail // Endereço de quem envia
emailMessage.Recipient[1] = recipientEmail // Endereço do destinatário
emailMessage.Subject = subject // Assunto do e-mail
emailMessage.Message = messageText // Corpo da mensagem

// Exemplo de anexo usando recurso da versão 29
// Anexar arquivos usando um array, disponível na versão 29 para maior flexibilidade
attachments is array of string
attachments = ["C:\caminho\para\arquivo.pdf", "C:\caminho\para\outro_arquivo.txt"]

FOR EACH file OF attachments
emailMessage.Attach(file)
END

// Enviar o e-mail
IF NOT EmailSendMessage(smtpSession, emailMessage) THEN
Error("Erro ao enviar o e-mail: ", ErrorInfo(errMessage))
RETURN
END

// Fechar a sessão SMTP
EmailCloseSession(smtpSession)

Info("E-mail enviado com sucesso!")
//##############################
```

### Explicação do código atualizado:

1. **Passagem de parâmetros**:
- **`smtpServer`**: O endereço do servidor SMTP é passado como parâmetro (exemplo: "smtp.gmail.com").
- **`smtpPort`**: A porta usada para a conexão SMTP (geralmente 587 para TLS).
- **`senderEmail`** e **`password`**: O e-mail do remetente e a senha também são passados como parâmetros, permitindo flexibilidade.
- **`recipientEmail`**: O e-mail do destinatário é passado como parâmetro.
- **`subject`** e **`messageText`**: O assunto e o corpo do e-mail são personalizados através da passagem de parâmetros.

2. **Recursos da versão 29**:
- **Array para anexos**: Um recurso interessante na versão 29 é a possibilidade de usar um **array** para anexos, tornando o código mais flexível e organizado.
- **Melhorias de segurança**: O uso de **TLS** para criptografia é mantido com a opção `emailOptionSecuredTLS`, garantindo segurança durante o envio.

3. **Validação de erros aprimorada**:
- **`ErrorInfo(errMessage)`**: Utilizamos essa função para obter informações detalhadas sobre erros, proporcionando uma melhor experiência de depuração.

### Como usar:

Você pode chamar a procedure **`SendEmailWithParams`** passando os parâmetros necessários:

```wlanguage
SendEmailWithParams("smtp.gmail.com", 587, "seuemail@exemplo.com", "sua_senha", "destinatario@exemplo.com", "Assunto do E-mail", "Aqui está o corpo da mensagem.")
```

### Notas adicionais:
- **Segurança**: No caso de servidores de e-mail como Gmail, certifique-se de ativar o suporte para "apps menos seguros" ou configurar um token de autenticação específico, dependendo do provedor de e-mail.
- **Anexos**: No exemplo, mostramos como anexar múltiplos arquivos usando um array. Se quiser enviar sem anexos, basta não definir o array `attachments`.

Essa abordagem torna o envio de e-mail flexível e seguro, utilizando os recursos modernos da versão 29 do WinDev.

Se precisar de mais alguma modificação ou ajuste, estou à disposição!


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