goldim 0 Denunciar post Postado Janeiro 26, 2005 Como faço para verificar em qual windows a aplicação estar rodando, para poder chamar esta fução function RegisterServiceProcess(dwProcessID, dwType: integer):integer; stdcall; external 'KERNEL32.DLL'; pois quando utilizo ela no windows de plataforma nt ele diz que não existe esta função na biblioteca. isso eu ja sei, ja utilizo uma forma de esconder nesta plataforma, so que o meu programa pode rodar em ambas, como faço pra escolher a função somente quando o windows for 9x e quando form nt utilizar a outra que criei. Atenciosamente Igor Goldim Compartilhar este post Link para o post Compartilhar em outros sites
Massuda 0 Denunciar post Postado Janeiro 26, 2005 Como faço para verificar em qual windows a aplicação estar rodando [...]Use a variável global Win32Platform declarada na unit SysUtils.No seu caso, se Win32Platform <> VER_PLATFORM_WIN32_NT, então você pode chamar RegisterServiceProcess.Não use um $IFDEF, porque seu teste precisa ser feito em tempo de execução. Compartilhar este post Link para o post Compartilhar em outros sites
goldim 0 Denunciar post Postado Janeiro 26, 2005 Como eu faria a sintaxe dei-me um exemplo.ao executra o programa aparece essa msg Não foi possivel localizar o ponto de entrada do procedimento RegisterServiceProcess na biblioteca de vinculo dinâmico 'KERNEL32.DLL'essa mensagem que eu quero evitar e que o programa continue rodando.usuaria assim? // verificar sistema operacionalprocedure TFormCheck.FormCreate(Sender: TObject); if ( Win32Platform <> VER_PLATFORM_WIN32_NT ) then RegisterServiceProcess(GetCurrentProcessID, 1) else HabilitaCTRLALTDEL(false);utilizo uma lib para a função function RegisterServiceProcess(dwProcessID, dwType: integer):integer; stdcall; external 'KERNEL32.DLL';uma coloco ela na interfacenesta hora que devo fazer a verificaçãocomo deveria ser feito?Atenciosamente Igor Goldim Compartilhar este post Link para o post Compartilhar em outros sites
Massuda 0 Denunciar post Postado Janeiro 26, 2005 O teste da versão do Windows é parte da solução. A mensagem Não foi possivel localizar o ponto de entrada do procedimento RegisterServiceProcess na biblioteca de vinculo dinâmico 'KERNEL32.DLL'aparece por causa da declaraçãofunction RegisterServiceProcess(dwProcessID, dwType: integer):integer; stdcall; external 'KERNEL32.DLL';Essa declaração cria um link estático entre seu programa e a rotina RegisterServiceProcess; isso significa que ao iniciar seu programa, o Delphi irá tentar localizar essa rotina na DLL (no caso, kernel32.dll) e irá falhar se não encontrar.O que você precisa é criar um link dinâmico com a rotina RegisterServiceProcess. Um jeito de fazer isso (não testei) seria:type TRegisterServiceProcessProc = function (dwProcessID, dwType: integer):integer; stdcall;var RegisterServiceProcess: TRegisterServiceProcessProc; H: THandle;begin H := GetModuleHandle('kernel32'); if H <> 0 then begin RegisterServiceProcess := GetProcAddress(H, 'RegisterServiceProcess'); if @RegisterServiceProcess <> nil then begin RegisterServiceProcess(GetCurrentProcessID, 1); end; end;end;Você vai ter que adaptar o exemplo de acordo com suas necessidades.Você pode obter mais informações sobre link dinâmico nestes artigos (em inglês): Dynamic loading and binding of DLLs e Tutorial::Dynamically Loading DLL's.No meu exemplo não estou usando LoadLibrary e nem FreeLibrary porque eu sei que kernel32.dll é uma DLL que já está carregada pelo Delphi, por isso uso GetModuleHandle, mas no caso mais geral deveria usar LoadLibrary/FreeLibrary. Compartilhar este post Link para o post Compartilhar em outros sites
goldim 0 Denunciar post Postado Janeiro 26, 2005 Certo agora entendi a logicae funcionou corretamentevaleu pela força, precisando estamos ai. Compartilhar este post Link para o post Compartilhar em outros sites