Ir para conteúdo
Fórum Script Brasil

Thales Pontes Martins

Membros
  • Total de itens

    453
  • Registro em

  • Última visita

Tudo que Thales Pontes Martins postou

  1. Paulo, vou mandar um projeto que eu fiz para capturar as coordenadas dos pontos no AutoCAD, pra sua conta no IG.
  2. Meu amigo, se o arquivo está no cd você nunca vai conseguir mudar nenhumatributo dele, já que o cd é somente leitura, você não acha? Mas se o arquivo estiver no HD você pode usar as funções FileSetAttr ou SetFileAttributes.
  3. Pode ser. Mas ele nem comentou nada sobre o assunto, só chegou aqui e disse que funcionou. E não são muitas pessoas que precisam de um código pra trabalhar com hibernação, seria muita coincidencia. O s3c eu pelo menos não vejo ele muito presente nos tópicos, mas o Micheus opina em 95% dos tópicos. Desde o dia 9 que ele não aparece. Deve ter ido viajar ou coisa parecida.
  4. Lukoso, será que você não postou no lugar errado não? Só estou avisando porque está escrito na sua assinatura :D . Ai gente, será que o Micheus morreu? Sumidaço ele. Ele sempre se intrometia nos tópicos (no bom sentido).
  5. Sempre que lembro de algum detalhe não consigo não postar. É o seguinte, eu declarei a função SetSuspendState com parametros do tipo boolean que é de 1 byte, mas o Windows trabalha sempre com todos os parametros de 4 bytes, então é bom usar o tipo BOOL que tem 4 bytes. Nesse caso não deu nenhum problema, mas é sempre bom seguir o padrão. Então ficaria -> function setsuspendstate(a, b, c:BOOL) : integer; stdcall; external 'powrprof.dll' name 'SetSuspendState';
  6. Muito obrigado, foi muito bom discutir com você, espero que possamos fazer mais vezes. Esse tópico me rendeu 27 posts em 1 dia. A propósito você não quer discutir sobre a política no brasil pra ver se agente atinge a meta de 300 posts? Já que o maior tópico da SB que eu já vi tem 282 posts. :lol:
  7. Espero que você tenha visto o meu post sobre o stdcall, e que não é preciso usar esse código do site do torry. Eu comentei isso num outro post. É no site da microsoft que eu encontro todas essas informações sobre funções do windows. E a mesma documentação também pode ser encontrada na ajuda do Delphi 2006.
  8. Opa, Paulo. Desculpe a ignorância. Eu sabia que todos os processos externos tem que ser chamados com stdcall, mas não o coloquei porque também não estavam presentes na implementation da unit windows, mas depois fui ver que estavam na interface, portanto do outro jeito também funciona se for declarado dessa maneira-> function setsuspendstate(a,b,c:boolean) : integer; stdcall; external 'powrprof.dll' name 'SetSuspendState';
  9. Fala Paulo. Vai trabalhar hoje? É o seguinte. Quando eu descobrí que a função SetSuspendState estava numa dll eu usei o jeito mais fácil de importar a função como é feito na unit windows para importar a api, que é carregar a dll quando inicia-se a execução do programa. Ai eu hibernei meu computador umas 300 vezes fazendo testes por causa daquele erro. Mas se eu tivesse feito uma buscazinha no bom e velho google, eu teria achado mais rápido. No site do Torry eu achei um exemplo dessa função, só que usando as fuções GetModuleHandle, GetProcAddress e LoadLibrary que são usadas para chamar a dll somente na hora que for ser usada a função, depois é fechada. Desse jeito não ocorreu o erro. Com certeza deve ser alguma coisa a ver com o acesso a dll depois da volta da hibernação, pode ser que precise ser aberta novamente ou coisa parecida. Aí está o código -> var _SetSuspendState: function (Hibernate, ForceCritical, DisableWakeEvent: BOOL): BOOL stdcall = nil; function LinkAPI(const module, functionname: string): Pointer; forward; function SetSuspendState(Hibernate, ForceCritical, DisableWakeEvent: Boolean): Boolean; begin if not Assigned(_SetSuspendState) then @_SetSuspendState := LinkAPI('POWRPROF.dll', 'SetSuspendState'); if Assigned(_SetSuspendState) then Result := _SetSuspendState(Hibernate, ForceCritical, DisableWakeEvent) else Result := False; end; function LinkAPI(const module, functionname: string): Pointer; var hLib: HMODULE; begin hLib := GetModulehandle(PChar(module)); if hLib = 0 then hLib := LoadLibrary(PChar(module)); if hLib <> 0 then Result := getProcAddress(hLib, PChar(functionname)) else Result := nil; end; // Example Call: // Beispielaufruf: procedure TForm1.Button1Click(Sender: TObject); begin SetSuspendState(True, False, False); end;
  10. Então deve estar pegando o problema dos privilégios. Mas o ruims é que é preciso ter privilégios para habilitar algum privilégio com a função que mencionei, então acho que é preciso ser administrador do sistema mesmo para conseguir isso. Caso tenha curiosidade de olhar a documentação do windows no site da microsoft, o nome da função é AdjustTokenPrivileges. Seu uso é bem complicadinho. Tem que se habilitar o privilégio SE_SHUTDOWN_NAME para poder fazer a hibernação. Por enquanto não cabe tecer maiores detalhes sobre ela. Vou fazer vários testes aqui, e se por acaso surgir a necessidade da utilização dela, entraremos em maiores detalhes. Agora tenho que sair. Amanhã agente chega aos 90 posts.
  11. Tem uma função que ajusta os privilégios do processo, mas enquanto isso tenta fazer com essa função pra ver se ocorre o erro, caso não consiga a hibernação, avise que eu detalharei a função dos privilégios aqui.
  12. Talvez com essa função não ocorra o access violation. Vamos bater o record mundial de posts num forum :lol: .
  13. ok! Se for de alguma utilidade, existe a função a seguir que também faz a hibernação, só que com essa parece que o processo precisa de previlégios concedidos pelo sistema operacional para conseguir a hibernação, do contrário a hibernação falha. function SetSystemPowerState(fSuspend, fForce : boolean) : Boolean; fSuspend true suspende, false hiberna. fForce true manda mensagem PBT_APMSUSPEND para todos os processos e força suspensão, do contrário manda PBT_APMQUERYSUSPEND para processos e pede por permissão para suspender. O retorno é não-zero se falhar e zero se obtiver sucesso.
  14. beleza. Vou ver o que posso fazer. Não vai ser fácil, ainda mais que meu computador toda vez que da boot da um erra na bios, aí eu tenho que ir no setup para concertar :angry: .
  15. Vale fazer certos testes, por exemplo, rode duas cópias desse executável, e mande hibernar por uma delas. Se só a que mandou hibernar der o erro no retorno da hibernação é porque tem a ver com a chamada da função, ou seja, o windows trata o processo que solicitou a hibernação diferentemente dos demais. Depois de constatado isso, deveremos quebrar a cabeça lendo a documentação do windows e do Delphi. Vou ver se descubro esse erro e posto mais tarde, caso descubra. Pode demorar.
  16. ahh, desculpa, o access violation não tem nada a ver com isso não porque testei aqui sem esse procedimento de mensagem e deu o mesmo erro.
  17. Ahhhhhhh, Paulo, tem mais um detalhe: Só é necessário o result ser igual a 1 no caso da mensagem ser PBT_QUERYSUSPEND, onde o 1 significa que você aceitou a suspensão e 0 que não. Quando a mensagem é PBT_RESUMESUSPEND não há retorno nenhum, então nesse caso não deve ser executado o comando msg.result:=1;. Certo? Pode ser que por uma razão inexplicavel isso até resolva o access violation.
  18. ahhh, esquecí: PBT_APMSUSPEND = 4
  19. É, o caso do access violation eu realmente não sei porque ocorre, eu teria que estudar mais sobre isso. E eu não entendí o que você não entendeu. Se um programa solicitou a suspensão, não há motivo para o windows perguntar para o mesmo se pode suspender o processo porque ele já sabe que o programa deve aceitar. Nesse caso a mensagem é enviada mas não com wParam igual a PBT_APMQUERYSUSPEND, somente com wParam igual a PBT_APMSUSPEND. Tente verificar esse ultimo parametro pra ver se ele avisa. Falei?
  20. Aqui também deu erro de Access Violation, pensei que fosse por causa que estivesse rodando diretamente do Delhpi (sessão de debug ativa). você tentou rodar independentemente do Delphi? E quanto a ele não mostrar a mensagem (hibernando), é porque a mensagem não é enviada ao próprio programa que solicitou a suspenção, somente é enviada quando é retomada a execução.
  21. Opa Paulo, a função está numa dll do windows chamada powrprof.dll, então use assim-> function setsuspendstate(a,b,c:boolean) : integer; external 'powrprof.dll' name 'SetSuspendState'; procedure TForm1.Button1Click(Sender: TObject); begin SetSuspendState(true,false,true); end;
  22. :D hehe, também não consegui compilar, deveria estar na unit Windows, mas não está. Vou dar uma pesquisada e posto mais tarde. Foi mal.
  23. Não depende do hardware, é uma função do windows mesmo. Aí vai o significado dos parametros-> 1 - true hiberna, false dorme. 2 - true para o sistema imediatamente, false manda essa mensagem para os programas para que eles tomem as devidas providencias. 3 - true o sistema disabilita todos os eventos de Wake, false ele não o faz.
  24. SetSuspendState(true, false, true); isso põe o computador para hibernar.
  25. encontradas na unit messages é que controlam a hibernação? Com certeza. Essas são as constantes usadas pela mensagem anteriormente usada, a WM_POWER, que se tornou obsoleta, vindo a ser substituída pela WM_POWERBROADCAST.
×
×
  • Criar Novo...