USUÁRIO:      SENHA:        SALVAR LOGIN ?    Adicione o VBWEB na sua lista de favoritos   Fale conosco 

 

  Fórum

  Visual Basic
Voltar
Autor Assunto:  CopyMemory
Leonardo
SÃO PEDRO DA ALDEIA
RJ - BRASIL
Postada em 06/12/2004 01:02 hs            
Já vi várias rotinas que usam essa API, mas até hoje não descobri pra que ela realmente serve... Alguém saberia me explicar?
 
Obrigado.
     
Snake
Pontos: 2843
ITAJUBÁ
MG - BRASIL
ENUNCIADA !
Postada em 06/12/2004 08:40 hs         
Veja essa função:

Private Declare Function NetRemoteTOD Lib "NETAPI32.DLL" (ByVal server As String, buffer As Any) As Long
Private Declare Function NetApiBufferFree Lib "NETAPI32.DLL" (ByVal buffer As Long) As Long
Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)

Private Type TIME_OF_DAY
    t_elapsedt As Long
    t_msecs As Long
    t_hours As Long
    t_mins As Long
    t_secs As Long
    t_hunds As Long
    t_timezone As Long
    t_tinterval As Long
    t_day As Long
    t_month As Long
    t_year As Long
    t_weekday As Long
End Type

Private Sub Command1_Click()
Dim t As TIME_OF_DAY
Dim tPtr As Long
Dim res As Long
Dim szServer As String
Dim days As Date
Dim todays As Date

'Convert the server Name To unicode
szServer = StrConv("\Your Server!", vbUnicode)    

'You could also pass vbNullString For the server Name
res = NetRemoteTOD(szServer, tPtr)  

If res = 0 Then
'Copy the pointer returned To a TIME_OF_DAY structure
  CopyMemory t, ByVal tPtr, Len(t)
  days = DateSerial(70, 1, 1) + (t.t_elapsedt / 60 / 60 / 24)  

  'Convert the elapsed time since 1/1/70 To a date
  days = days - (t.t_timezone / 60 / 24)  


  'Adjust For TimeZone differences
  'Get local computer information For comparison
   todays = DateSerial(70, 1, 1) + (DateDiff("s", DateSerial(70, 1, 1), Now()) / 60 / 60 / 24)
  
  Me.Cls
  Print DateDiff("s", DateSerial(70, 1, 1), Now()), todays, t.t_elapsedt, days
  NetApiBufferFree (tPtr) 'Free the memory at the pointer
Else
  MsgBox "Error occurred call NetRemoteTOD: " & res, vbOKOnly, "NetRemoteTOD"
        'Error 53: cannot find server
    End If
End Sub
   
Leonardo
SÃO PEDRO DA ALDEIA
RJ - BRASIL
ENUNCIADA !
Postada em 06/12/2004 13:40 hs            
E? Qual foi a utilidade do CopyMemory nessa rotina? É isso que quero saber...
   
Sandro
não registrado
ENUNCIADA !
Postada em 06/12/2004 23:08 hs   
CopyMemory é uma função para gerenciamento de blocos de memória. Ela permite a transferência rápida de conteúdo de uma variável para outra. Existem alguns algoritmos que permitem a cópia de um vetor inteiro de mais de 10.000 itens com uma única chamada a CopyMemory, cerca de 70% mais rápido que qualquer método padrão de cópia de vetores. Além disso existe também alternativas para o uso da função AddressOf do VB que usam CopyMemory para retorna o ponteiro para uma função dentro do programa.
   
Leonardo
SÃO PEDRO DA ALDEIA
RJ - BRASIL
ENUNCIADA !
Postada em 06/12/2004 23:37 hs            
Como eu imaginava. Acontece que estou fazendo um hook de teclado. Usei como base uma outra rotina, que funcionava. Resolvi fazer um do zero que é pra aprender mais sobre APIs. Minha função:
 
Public Function MonitorTeclado(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim Vale As Boolean
    Vale = True
    If nCode = HC_ACTION Then
        Vale = Not ((wParam = 91) Or (wParam = 92))
    End If
    If Vale Then
        MonitorTeclado = CallNextHookEx(HookId, nCode, wParam, ByVal lParam)
    Else
        MonitorTeclado = -1
    End If
End Function
 
A intenção inicial é só bloquear essas teclas do Windows (que abrem o menu iniciar). Para iniciar o hook:
 
HookId = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf MonitorTeclado, App.hInstance, 0)
 
Para finalizar:
 
UnhookWindowsHookEx HookId
 
Até aí, tudo como manda a documentação, que também diz que, para a tecla "ter efeito", a função que faz o monitoramente tem que retornar 0. Se é pra tecla ser bloqueada, é pra retornar qualquer valor que não seja 0. Pois bem, eu retorno -1, como na rotina que usei de exemplo. Acontece que a minha não funciona. A única coisa que vi de diferente entre a minha rotina a outra é o uso da API CopyMemory. A documentação diz que a função de monitoramente recebe em wParam o código virtual da tecla. No caso das teclas do windows, 91 (esquerda) e 92 (direita). A função exemplo, fazia assim:
 
CopyMemory p, ByVal lParam, Len(p)
 
Copiava de lParam pra p, é uma estrutura. Essa daqui:
 
Public Type KBDLLHOOKSTRUCT
    vkCode As Long
    scanCode As Long
    flags As Long
    time As Long
    dwExtraInfo As Long
End Type
 
E depois fazia algo como:
 
If p.vkCode = xx Then ' xx é o número da tecla
 
Aí eu fiquei sem entender... Pelo que entendi, o "bloqueio" das teclas tem a ver somente com o valor que a função retorna. Ninguém falou nada de ter que usar o CopyMemory. Por isso eu queria saber se essa função faz alguma coisa além de copiar partes da memória de um canto para outro... Alguém saberia me dizer se o fato deu não ter usado o CopyMemory na minha rotina pode ter influenciado em alguma coisa?
 
Obrigado.
   
Página(s): 1/1    


Seu Nome:

Seu eMail:

ALTERAR PARA MODO HTML
Mensagem:

[:)] = 
[:P] = 
[:(] = 
[;)] = 

HTML DESLIGADO

     
 VOLTAR

  



CyberWEB Network Ltda.    © Copyright 2000-2024   -   Todos os direitos reservados.
Powered by HostingZone - A melhor hospedagem para seu site
Topo da página