Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

goldim

{$ifdef win32}

Recommended Posts

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

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

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

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ção

function 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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.