O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Ligni - Win32API

Iniciado por Kvothe, 26/05/2018 às 14:35


Requerimento: https://dax-soft.weebly.com/ligni-core.html
Engine: Irei utilizar o RPG Maker ACE.
Nível: Recomendo para quem já possuí um bom conhecimento em Ruby. Um intermediário da vida. Recomendo também lerem o código do Ligni Core, aqui iremos utilizar somente o module API.




Me deu uma súbita vontade de escrever uma pequena aula referente ao Win32API. Porém, ao invés de utilizar da maneira padrão, iremos utilizar da maneira 'Lignidíana', i.e, utilizando o Ligni Core, que eu e o Sotellie fizemos. A aula será objetiva e rápida hehe!

A classe Win32API é utilizada para chamarmos funções referentes à DLL. Ou seja, coisas que não se fazem com Ruby (ou que seria muito cansativo fazer), é feita por intermédio de uma DLL escrita em C/C++. Nesse tutorial irei mostrar uma maneira sexy e intuitiva de chamar essas funções. Caso queira aprender a escrever uma, veja isso.

Como a intenção é ser objetivo no quesito mostrar, irei utilizar duas funções. 'Beep' da DLL Kernel32 e o famigerado, 'CopyFile' do Kernel32



Primeiro passo: Em um novo script na Database de Scripts, iremos incluir a API.
include API

Então, iremos definir duas variáveis que irão carregar as funções Beep e CopyFile. Chequem o hyperlink e deem uma olhada nos parâmetros que devemos definir de cada função.
Com isso, iremos escrever *(o retorno 'bool' pode ser definido como 'int/long'):
# incluir as funções do module
include API
# nossa Beep
beep = long('Beep', [:DWORD, :DWORD], 'kernel32')
# nosso CopyFile
copy = long('CopyFile', [:LPCTSTR, :LPCTSTR, :BOOL], 'kernel32')





Segundo passo: Aqui iremos aprender a chamar a função (coisa 'mah' fácil do mundo) e também, estabelecer chamados pré-definidos.
Para chamar a função, basta utilizarmos o 'call' e definir os valores para os argumentos, como:
beep.call(2515, 51)

Agora, para estabelecermos funções pré-definidas, devemos utilizar do lambda nos métodos que usamos para chamar a função 'long/int/char/void'. Dentro desse lambda, iremos definir uma 'Hash' e dentro dela, iremos fazer a seguinte configuração:
{
  # nome do método: [valores dos argumentos],
  test: [2515, 51]
}

Veja como está o código até então:
# incluir as funções do module
include API
# nossa Beep
beep = long('Beep', [:DWORD, :DWORD], 'kernel32') do 
  {
    # nome do método: [valores dos argumentos],
    test: [2515, 51]
  }
end
# nosso CopyFile
copy = long('CopyFile', [:LPCTSTR, :LPCTSTR, :BOOL], 'kernel32')

Agora, para chamarmos essa função pré-definida, basta usarmos:
beep.test



Terceiro passo: Agora iremos aprender a fazer funções pré-definidas que carregam argumentos que podem ser modificados. Ou seja, quando chamarmos essa função, poderemos definir argumentos também.
Para isso, dentro da Array que carrega os valores dos parâmetros, deixaremos um valor vazio onde queremos chamar com um valor 'modificado'/'configurado'. Veja abaixo:
beep = long('Beep', [:DWORD, :DWORD], 'kernel32') do 
  {
    # nome do método: [valores dos argumentos],
    test: [nil, 51]
  }
end

Assim, poderemos chamar um valor customizado para o primeiro argumento:
beep.test 3590



Código final abaixo e sobre o CopyFile, deixarei com vocês:
# incluir as funções do module
include API
# nossa Beep
beep = long('Beep', [:DWORD, :DWORD], 'kernel32') do 
  {
    # nome do método: [valores dos argumentos],
    test: [nil, 51]
  }
end
# nosso CopyFile
copy = long('CopyFile', [:LPCTSTR, :LPCTSTR, :BOOL], 'kernel32')

beep.test 2515
beep.call(546, 52)



Interessante isso aí. É bom saber como as tão faladas DLLs são instaladas em jogos de RM. E esse beep vai render gambiarras futuras, pode ter certeza.  :malvado: