Colocar programa residente na memória ?

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Colocar programa residente na memória ?

Mensagem por Grings »

.
Editado pela última vez por Grings em 22 Mai 2009 20:49, em um total de 2 vezes.
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Re: Colocar programa residente na memória ?

Mensagem por marcos.gurupi »

Vc usa a hwgui? Eu sei q com ela eh possivel pq uso assim.

Marcos Roberto.
Marcos Roberto
NetService Software
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Colocar programa residente na memória ?

Mensagem por sygecom »

Você pode deixar o mesmo rodando no TRAY, e com um TIMER para vereficar a cada X segundos se tem o arquivo.
Na Hwgui ficaria mais ou menos assim:

Código: Selecionar todos

Function Main()
   Local oMainWindow, oTrayMenu, oIcon := HIcon():AddResource("ICON_1")
   Private oTimer, oFont
   
   REQUEST HB_LANG_PT
   REQUEST HB_CODEPAGE_PT850

   HB_LANGSELECT("PT")
   HB_SETCODEPAGE( "PT850" )

   Verefica_Ini()  // VEREFICA SE TEM O ARQUIVO INI PARA CONFIGURAÇÕES DE CONEXÃO AO BANCO ON-LINE

   IF ( hWnd := Hwg_FindWindow( oMainWindow,"Atualizador do Web-Site" ) ) != 0
      Hwg_SetForegroundWindow( hWnd )
      Return
   ENDIF

   PREPARE FONT oFont NAME "Ms San Serif" WIDTH 0 HEIGHT -15 WEIGHT 400

  	INIT WINDOW oMainWindow MAIN TITLE "Atualizador de Web-Site"
		 CONTEXT MENU oTrayMenu
   MENUITEM "Sobre" ACTION {|| sobre()}
   SEPARATOR
   MENUITEM "Exit" ACTION {|| MyExitProc()}
   ENDMENU
   SET TIMER oTimer of oMainWindow VALUE 600000 ACTION {|| Atualiza_dados() }

 		oMainWindow:InitTray(oIcon,,oTrayMenu,"Atualizador do Web-Site")

  	ACTIVATE WINDOW oMainWindow NOSHOW
oTrayMenu:End()
Return Nil

*******************
Function MyExitProc
*******************
IF MSGNOYES("Deseja Realmete Sair do Programa ?","Aviso do Sistema")
   DBCLOSEALL()
   __Quit()
Else
   RETURN
ENDIF
RETURN

Function Verefica_Ini
IF !FILE("sygecom.ini")
   Hwg_WriteIni( 'Mysql', 'Host',     "localhost", oDirec+"sygecom.Ini" )
   Hwg_WriteIni( 'Mysql', 'Usuario',  "root",      oDirec+"sygecom.Ini" )
   Hwg_WriteIni( 'Mysql', 'Senha',    "",          oDirec+"sygecom.Ini" )
   Hwg_WriteIni( 'Mysql', 'Banco',    "sygecom",   oDirec+"sygecom.Ini" )
   Hwg_WriteIni( 'Mysql', 'Porta',    "3306",      oDirec+"sygecom.Ini" )
Endif
Return Nil

Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

.

Mensagem por Grings »

.
Editado pela última vez por Grings em 22 Mai 2009 20:48, em um total de 2 vezes.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Colocar programa residente na memória ?

Mensagem por sygecom »

Grings, se não quer usar uma LIB grafica para colocar no TRAY, pode fazer em modo console mesmo e deixar rodando como serviço, para isso pode usar o sisteminha em ANEXO, clique duas vez nele que vai abrir uma tela mostrando como usar o mesmo.
Outra opção, seria usar MT, e deixar sua propria apliacação fazendo essa varredura, porem o MT do xharbour esta dando uns pau sem exeplicação nehuma, sei lah, talvez seja só comigo, mas parei de usar por não conseguir resolver os problemas com MT.
Anexos
Prog2Svc.zip
(27.38 KiB) Baixado 538 vezes
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
rodrmigu
Usuário Nível 3
Usuário Nível 3
Mensagens: 150
Registrado em: 27 Nov 2007 15:13
Localização: Indaiatuba SP

Re: Colocar programa residente na memória ?

Mensagem por rodrmigu »

Olá Grings,

Você pode tentar usar services, algo assim:

Código: Selecionar todos

Procedure main()
    do while .t.
	tone(400,1)
	inkey(5)
    enddo        
return


#PRAGMA BEGINDUMP

#ifdef __WIN32__
            
#include <windows.h>
#include "hbapi.h"
#include "hbvm.h"

#define SERVICENAME "TestService"
#define SERVICEDISPLAY "Harbour Service Test"

SERVICE_STATUS m_ServiceStatus;
SERVICE_STATUS_HANDLE m_ServiceStatusHandle;
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
void WINAPI ServiceCtrlHandler(DWORD Opcode);
void InstallService(void);
void RemoveService(void);

void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
{
    m_ServiceStatus.dwServiceType = SERVICE_WIN32;
    m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
    m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
    m_ServiceStatus.dwWin32ExitCode = 0;
    m_ServiceStatus.dwServiceSpecificExitCode = 0;
    m_ServiceStatus.dwCheckPoint = 0;
    m_ServiceStatus.dwWaitHint = 0;
    
    m_ServiceStatusHandle = RegisterServiceCtrlHandler(SERVICENAME, ServiceCtrlHandler); 
    
    if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
    {
        return;
    }
    
    m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
    m_ServiceStatus.dwCheckPoint = 0;
    m_ServiceStatus.dwWaitHint = 0;
    
    if (!SetServiceStatus (m_ServiceStatusHandle, &m_ServiceStatus))
    {
    }

    hb_cmdargInit( argc, argv );
    hb_vmInit( TRUE );
    
    return;
}

void WINAPI ServiceCtrlHandler(DWORD Opcode)
{
    switch(Opcode)
    {
        case SERVICE_CONTROL_PAUSE: 
            m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
            break;
            
        case SERVICE_CONTROL_CONTINUE:
            m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
            break;
            
        case SERVICE_CONTROL_STOP:
            m_ServiceStatus.dwWin32ExitCode = 0;
            m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
            m_ServiceStatus.dwCheckPoint = 0;
            m_ServiceStatus.dwWaitHint = 0;
        
            SetServiceStatus (m_ServiceStatusHandle,&m_ServiceStatus);

            hb_vmQuit();
            break;
            
        case SERVICE_CONTROL_INTERROGATE:
            break; 
    }
    return;
}

void InstallService(void)
{
    char szPath[512];
    HANDLE schSCManager,schService;
    
    if (GetModuleFileName( NULL, szPath, 512) == 0)
        return;
      
    schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
    
    if (schSCManager == NULL) 
        return;
    
    schService = CreateService(
        schSCManager,               // SCManager database
        SERVICENAME,                // name of service
        SERVICEDISPLAY,             // name to display
        SERVICE_ALL_ACCESS,         // desired access
        SERVICE_WIN32_OWN_PROCESS,  // service type
        SERVICE_AUTO_START,         // start type
        SERVICE_ERROR_NORMAL,       // error control type
        szPath,                     // service's binary
        NULL,                       // no load ordering group
        NULL,                       // no tag identifier
        NULL,                       // dependencies
        NULL,                       // LocalSystem account
        NULL);                      // no password
    
    if (schService == NULL)
    {
        if (GetLastError() == ERROR_SERVICE_EXISTS)
            printf("Service Already Exists.\n");                        
        
        printf("Service Was not Installed Successfully. Error Code %d\n", GetLastError());
        return; 
    }
    
    CloseServiceHandle(schService);
    printf("Service Installed Sucessfully\n");    
    
    return;
}

void RemoveService(void)
{
    HANDLE schSCManager;
    SC_HANDLE schService;
  
    schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
    
    schService = OpenService( 
        schSCManager,       // SCManager database 
        SERVICENAME,          // name of service 
        DELETE);            // only need DELETE access 
 
    if (schService == NULL)
    { 
        printf("OpenService failed (%d)\n", GetLastError()); 
        return;
    }
 
    if (! DeleteService(schService) ) 
    {
        printf("Delete Service failed (%d)\n", GetLastError()); 
        return;
    }
    else 
        printf("DeleteService succeeded\n"); 
 
    CloseServiceHandle(schService); 
  
    return;    
}


void main( int argc, char * argv[] )
{
    if (argc > 1)
    {
        if (strcmp(argv[1], "-i") == 0)
            InstallService();
        
        if (strcmp(argv[1], "-d") == 0)
            RemoveService();
    }
    else
    {        
        SERVICE_TABLE_ENTRY DispatchTable[]= {{SERVICENAME, ServiceMain}, {NULL,NULL}};    
        StartServiceCtrlDispatcher(DispatchTable);
    }
}

#endif

#PRAGMA ENDDUMP
Para instalar o serviço, digite:

meu_programa.exe -i

para remover

meu_programa.exe -d

[]'s
Rodrigo
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Colocar programa residente na memória ?

Mensagem por sygecom »

Show de Bola esse exemplo....
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Re: Colocar programa residente na memória ?

Mensagem por marcos.gurupi »

Perfeito. Mas desculpe a ignorancia. Como eu poderia por exemplo monitorar algo com o exemplo acima?

Marcos Roberto
Marcos Roberto
NetService Software
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Re: Colocar programa residente na memória ?

Mensagem por Eolo »

Marcos, é só a usar a função DIRECTORY() para conferir se tem algum arquivo na tal pasta. Um exemplo, resumido:

O Programa1 vai gravando os tais arquivos na pasta "c:\exemplo\print".

O Programa2 fica monitorando essa pasta. Quando aparecer alguma arquivo lá, ele imprime e deleta:

Código: Selecionar todos

do whil .t.
  a=directory("c:\exemplo\print\*.txt")
  if len(a)=0
    inkey(10)
  else
    for b=1 to len(a)
       * faz a impressão do arquivo indicado em a[b]
       * deleta o arquivo indicado em a[b]
     next
  endi
endd  
Uma dica: faça o Programa1 gerar cada arquivo com um nome transitório (por exemplo, com extensão "xxx"). Depois, quando o arquivo estiver pronto, ele é renomeado (de "XXX" para "TXT"). Com isso, você evita que o Programa2 comece a processar um arquivo que ainda está sendo formado...

Eu uso algo semelhante em um mercado: quando cada caixa fecha um cupom, é gerado um arquivo local. Por outro lado, eu tenho um EXE no servidor periodicamente examinando essas pastas dos caixas... Quando aparece algum arquivo, eu o leio, transfiro a informação pra retaguarda e o apago.
evaldo
Usuário Nível 3
Usuário Nível 3
Mensagens: 113
Registrado em: 27 Out 2005 23:29

Re: Colocar programa residente na memória ?

Mensagem por evaldo »

Alguem consegiu usar o exemplo do Rodrigo, compilei normal, mas a app nao vai para o servico do windows, alguem sabe porque, usei o parametro -i.

Abraco
Evaldo
rodrmigu
Usuário Nível 3
Usuário Nível 3
Mensagens: 150
Registrado em: 27 Nov 2007 15:13
Localização: Indaiatuba SP

Re: Colocar programa residente na memória ?

Mensagem por rodrmigu »

Eu testei com windows XP. Se alguém mais puder confirmar o funcionamento.

[]'s
Rodrigo
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Colocar programa residente na memória ?

Mensagem por sygecom »

Eu testei em Windows XP e funcionou legal.
Evaldo, explique melhor onde não apareceu como serviço ? sabe que se estiver com a tela de visualização de serviços , após instalar o seu serviço, vc deve dar um F5 para atualizar a lista. e depois para iniciar o serviço vc pode usar o NET START NOMESERVICO
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: Colocar programa residente na memória ?

Mensagem por rochinha »

Amiguinhos

Para os programas que criamos, achamos chique chama-los de serviços, mas os mesmo não serão executados pelo Gerenciador de Serviços do Windows por serem apenas Aplicativos de BackGround(segundo plano).

O que chamamos de serviços são na realidade Processos. Estes processos aparecem no Gerenciador de Tarefas onde podemos controla-los e até finaliza-los.

Os serviços serão listados no Gerenciador de Serviços(Ferramentas Administrativas/Serviços) e portanto os Processos que executamos não farão parte deles a não ser que se tenha criado um serviço real.

Eis um exemplo de processo que tem o intuito de visualizar uma pasta e analisar em seu conteudo a existencia de um arquivo especifico e ao encontrá-lo executar uma tarefa.

O mesmo foi feito em Fivewin e roda em um cliente que possui rede com maquinas XP e uma unica impressora matricial 40 colunas Procomp(antiga e dificil de mapear).

O processo funciona assim:

- Ao ser executado adiciona as entradas RUN do registro uma linha de execução no starter do Windows.
- A cada X segundos verifica se existem arquivos com extensão .ECF em sua raiz.
- Ao encontra-los faz a impressão de cada um na sequencia de criação.
- Exclui cada arquivo após a impressão.
- Usa vários motores de impressão, mas preferi usar o PRINT.EXE que é encontrado em qualquer Windows.

Ele jogara na impressora o conteudo de qualquer arquivo que tenha a extensão .ECF portanto pode servir para qualquer intuito, mas foi necessário usa-lo pois a impressora só imprimia a partir da maquina em que estava espetada e segundo o cliente, ficou show-de-bola. Os PDVs podem ser usados à vontade mandando impressões que serão recebidas na impressora no caixa.

O codigo abaixo faz parte de um processo que fotografa o desktop do usuario a cada X segundos e envia a imagem para uma pasta visualizada pelo administrador. Uma espécie de programa espião. Outro lance legal para este tipo de aplicativo é poder reconhecer os aplivativos abertos como, MSN ou Orkut e enviar a foto para um email pre-programado.

Usem o código para analise e adaptem a sua GUI preferida.

Código: Selecionar todos

#include "FiveWin.ch" 
#include "dll.ch" 

#DEFINE WM_SYSCOMMAND  274     // &H112
#DEFINE SC_TASKLIST   61744    //&HF130
#DEFINE SC_SCREENSAVE 61760   // &HF140
#DEFINE SW_HIDE           0   // &H0
#DEFINE SW_SHOWNA         8   // &H8
#DEFINE SW_SHOW           5   // &H5
#DEFINE SW_SHOWNORMAL     1
#DEFINE SC_MONITORPOWER  61808   //&HF170   Gracias a Ramon Ramirez por la info
#DEFINE SM_CLEANBOOT     67

#DEFINE GWL_EXSTYLE   (-20) 
#DEFINE WS_EX_LAYERED 0x00080000 
#DEFINE LWA_ALPHA     0x00000002 
#DEFINE LWA_COLORKEY  0x00000001 

#DEFINE GW_CHILD      5
#DEFINE GW_HWNDNEXT   2
#DEFINE RT_BITMAP     2
#DEFINE MB_ICONEXCLAMATION 48
#DEFINE CBM_INIT 4 && should move to prg header
#DEFINE DIB_RGB_COLORS 0 && should move to prg header

static hLib, hDib, oSpoolTimer

Function Main(_tempo_) 
   Local oB, cImgFile := "service.bmp", oClp
   public oApp, oTray, oIcon, oIconOn, oIconOff
   public nLibrary := LoadLibrary( "ADVAPI32.DLL" )
   public cUsuario := space(15), cImage, cIMGAlerta, oEsconde
   lStatus := .f.
   Default _tempo_ := "05"
   cPath      := cFilePath( GetModuleFileName( GetInstance() ) )
   nTempo     := VerifyINI( "SERVICE", "TEMPO" , "10" , cPath+"service.ini" )
   //---------------
   Set Multiple off
   errfile  := "possrv.sos"
   if file(errfile)
      ferase(errfile) // Tenta eliminar o arquivo de controle
      if ferror() <> 0 // MsgStop("Sistema ja esta em execucao.","5Volution Legacy Fenix")
         quit
      endif
   else
      errhandle := fcreate(errfile) // Cria o arquivo de controle
      errhandle := FOPEN(errfile,1) // Abre travando o arquivo de controle
   endif
   //---------------
   SetDefServer()
   //---------------
   ServiceProcess(1) 
   //---------------
   DEFINE BRUSH oB COLOR CLR_HGRAY
   DEFINE ICON oIcon    FILE "LOGO.ICO"
   DEFINE ICON oIconOn  FILE "ICON1.ICO"
   DEFINE ICON oIconOff FILE "ICON2.ICO"
   //
   DEFINE CLIPBOARD oClp OF oApp
   DEFINE WINDOW oApp FROM 0,0 to 500,500 pixel TITLE "Service" BRUSH oB STYLE WS_POPUP ICON "pos.ico"
          DEFINE TIMER oSpoolTimer OF oApp INTERVAL (val(nTempo)*1000) ACTION GravaProcess( cImgFile, oApp ) 
          ACTIVATE TIMER oSpoolTimer
          oApp:nStyle := 1
          SET MESSAGE OF oApp TO "P.O.S Spool Server - 5Volution Legacy" CLOCK DATE
   ACTIVATE WINDOW oApp ; // ON INIT (Shell_NotifyIcon( 0, "pos.ico" ), oApp:Hide()) //VALID (oEsconde:End(), .t.)
            ON INIT ( oTray := TTrayIcon():New(oApp,oIconOn,"P.O.S Spool Server rodando...",{||fun()},{|nRow,nCol|MenuTray(nRow,nCol,oTray)} ) )

   ShowWindow( FindWindow(nil,'Program Manager'), SW_SHOW)
   ShowWindow(FindWindow( 'Shell_TrayWnd',nil), SW_SHOWNA)
   Return NIL                   

function MenuTray( nRow, nCol, oTray )
  local oMenu
  MENU oMenu POPUP
       MENUITEM "Configura Impressora" ACTION PrinterSetup()
       //SEPARATOR
       //MENUITEM "Mostra aplicativo"    ACTION ( oApp:Show(), oApp:SetFocus() )
       //MENUITEM "Esconde aplicativo"   ACTION ( oApp:Hide() )
       SEPARATOR
       MENUITEM "Fecha aplicativo"     ACTION oApp:end()
  ENDMENU
  ACTIVATE POPUP oMenu AT nRow, nCol OF oTray:oWnd
  return nil

function fun()
  return nil

//-------------------------------------
Function GravaProcess( cImgFile, oWnd ) 
//-------------------------------------
   LOCAL oWord, oTexto
   cEmiteMotor := "PRINT.EXE"
   oSpoolTimer:lActive := .f.
   CONTADOR  := ADIR( "*.ECF" )
   IF CONTADOR != 0
      DECLARE TXT_NOMES[ CONTADOR ]
      ADIR( "*.ECF", TXT_NOMES )
      FOR CONTADOR := 1 TO LEN( TXT_NOMES )
          PRNcFile := cPath + TXT_NOMES[CONTADOR]
          do case
             case cEmiteMotor = "PRINT.EXE"
                  WaitRun( "print.exe /D:LPT1 " + PRNcFile, 0 )
             case cEmiteMotor = "COMMAND.COM"
                  WaitRun( "command.com /c copy /b " + PRNcFile + " LPT1" , 0 )
             case cEmiteMotor = "WRITE"
                  WaitRun( "write " + PRNcFile + " /p" )
             case cEmiteMotor = "WAPI" 
                  WaitRun( [WAPI -PRINT:"]+PRNcPort+[";]+PRNcFile+[;"Impressao";RESULTA.TXT], 7 )
          endcase
          SysWait(5)
          if file( PRNcFile )
             fErase( PRNcFile )
          endif
      NEXT
   ENDIF
   oSpoolTimer:lActive := .t.
   if file( cPath + "desativa.ecf" )
      fErase( cPath + "desativa.ecf" )
      oSpoolTimer:lActive := .f.
      cancel
   endif
   SysRefresh()
   Return NIL

//-------------------------------------
Function ServiceProcess( mode ) 
//-------------------------------------
   Local nProcessId := 0 
   Default mode := 0 
   nProcessId := GCP( ) 
   If Abs( nProcessId ) > 0 
      RSProcess( nProcessId, mode ) 
   Endif 
   RETURN 

DLL32 FUNCTION DIBmpToJpg(SrcPath As String, DestPath As String, Quality As Long, progressive As Long) AS LONG PASCAL LIB "JPGDLL32.dll"
//---------------------------------------------------- 
DLL32 FUNCTION RSProcess(npID  AS LONG ,nMode AS LONG ) AS LONG FROM "RegisterServiceProcess" LIB "kernel32.DLL" 
DLL32 FUNCTION GCP() AS LONG FROM "GetCurrentProcessId" LIB "kernel32.dll" 
DLL32 STATIC FUNCTION FISAVE( nFormat AS LONG, hDib AS LONG, cFileName AS LPSTR, nFlags AS LONG ) AS BOOL PASCAL FROM "_FreeImage_Save@16" LIB hLib
//---------------------------------------------------- 
DLL32 FUNCTION WSAGetLastError() AS _INT PASCAL FROM "WSAGetLastError" LIB "wsock32.dll"
DLL32 FUNCTION inet_addr(cIP AS STRING) AS LONG PASCAL FROM "inet_addr" LIB "wsock32.dll"
DLL32 FUNCTION IcmpCreateFile() AS LONG PASCAL FROM "IcmpCreateFile" LIB "icmp.dll"
DLL32 FUNCTION IcmpCloseHandle(IcmpHandle AS LONG) AS LONG PASCAL FROM "IcmpCloseHandle" LIB "icmp.dll"
DLL32 FUNCTION IcmpSendEcho(IcmpHandle AS LONG,;
                            DestinationAddress AS LONG,;
                            RequestData AS STRING,;
                            RequestSize AS LONG,;
                            RequestOptions AS LONG,;
                            ReplyBuffer AS LPSTR,;
                            ReplySize AS LONG,;
                            Timeout AS LONG) AS LONG PASCAL FROM "IcmpSendEcho" LIB "icmp.dll"

function VerifyINI( _section_, _entry_, _var_, _inifile_, _grava_ )
   oIni := TIni():New( _inifile_ )
   if _grava_ = .t.
      oIni:Set( _section_, _entry_, _var_ )
   endif
   return oIni:Get( _section_, _entry_, _var_, _var_ )

function SetRegVar(nKey, cRegKey, cSubKey, uValue)
   LOCAL oReg, cValue
   nKey   := IF(nKey == NIL, HKEY_CURRENT_USER, nKey)
   uValue := IF(uValue == NIL, "", uValue)
   oReg   := TReg32():Create(nKey, cRegKey)
   cValue := oReg:Set(cSubKey, uValue)
   oReg:Close()
   RETURN cValue

Function SetDefServer()
   local HKEY_CURRENT_USER   := 2147483649
   local HKEY_LOCAL_MACHINE  := 2147483650
   local HKEY_CURRENT_CONFIG := 2147483653
   local KEY_ALL_ACCESS      := 983139
   cServPath:= cFilePath( GetModuleFileName( GetInstance() ) )
   cRegKey  := HKEY_LOCAL_MACHINE
   cSubKey  := "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
   cRegName := "POSSpoolServer"
   cRegData := cServPath + "POSSRV.EXE"
   SETREGVAR( cRegKey, cSubKey, cRegName, cRegData )
   return nil

//-------------------------------------------------------------------------//
DLL32 ;
FUNCTION RegOpenKeyEx(nhKey     AS LONG   ,;
                      cAddress  AS LPSTR  ,;
                      nReserved AS LONG   ,;
                      nSecMask  AS LONG   ,;
                      @nphKey   AS PTR     );     //By reference
         ;
         AS LONG PASCAL FROM "RegOpenKeyExA" LIB nLibrary // "ADVAPI32.DLL"

DLL32 ;
FUNCTION RegQueryValueEx(nhKey      AS LONG   ,;
                         cAddress   AS LPSTR  ,;
                         nReserved  AS LONG   ,;
                         @nType     AS PTR    ,;    //By reference
                         @cResult   AS LPSTR  ,;    //By reference
                         @nResSize  AS PTR     );   //By reference
         ;
         AS LONG PASCAL FROM "RegQueryValueExA" LIB nLibrary // "ADVAPI32.DLL"

DLL32 ;
FUNCTION RegCloseKey(nhKey AS LONG);
         ;
         AS LONG PASCAL FROM "RegCloseKey" LIB nLibrary // "ADVAPI32.DLL"

DLL32 ;
FUNCTION RegEnumKeyEx(nhKey      AS LONG   ,;
                      nIndex     AS LONG   ,;
                      @cBuffer   AS LPSTR  ,;   //By reference
                      @nBufSize  AS PTR    ,;   //By reference
                      nReserved  AS LONG   ,;   //Must be NULL
                      @cClass    AS LPSTR  ,;   //By reference (can be NULL)
                      @nClsSize  AS PTR    ,;   //By reference (can be NULL)
                      @pFileTime AS PTR    );   //By reference (can be NULL)
         ;
         AS LONG PASCAL FROM "RegEnumKeyExA" LIB nLibrary // "ADVAPI32.DLL"

DLL32 ;
FUNCTION RegSetValueEx(nhKey      AS LONG   ,;
                       cAddress   AS LPSTR  ,;
                       nReserved  AS LONG   ,;
                       nType      AS LONG   ,;
                       cData      AS LPSTR  ,;
                       nDataLen   AS LONG    );
         ;
         AS LONG PASCAL FROM "RegSetValueExA" LIB nLibrary // "ADVAPI32.DLL"

DLL32 ;
FUNCTION EnumPrinters(nTypes     AS LONG   ,;
                      cName      AS LPSTR  ,;
                      nLevel     AS LONG   ,;
                      @cBuffer   AS PTR    ,;   //By reference
                      nArrSize   AS LONG   ,;
                      @nBufLen   AS PTR    ,;   //By reference
                      @nNumArr   AS PTR    );   //By reference
         ;
         AS BOOL PASCAL FROM "EnumPrintersA" LIB nLibrary // "WINSPOOL.DRV"
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Inacio
Usuário Nível 1
Usuário Nível 1
Mensagens: 19
Registrado em: 07 Mai 2009 10:11
Localização: Curitiba-PR

Re: .

Mensagem por Inacio »

Pessoal, estou tentando usar o prog2svc, recomendado neste fórum, para rodar programa como serviço. Está dando o "erro 1073 ao tentar instalar o serviço ServiceName".

Quando eu mudo o comando para prog2svc -add meuprg c:\diretorio\meuprg.exe, na primeira vez funciona (diz que foi instalado). Na segunda, já dá o mesmo erro anterior.

Daí concluí que o erro refere-se ao fato de o serviço já estar instalado.

Mas instalado como? Ele não roda. Não entendi por que.

Alguém poderia me ajudar?

Inacio
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Colocar programa residente na memória ?

Mensagem por sygecom »

Use o exemplo postado pelo Rodrigo Moreno, que é compilado direto com xHarbour e não precisa de aplicativos de terceiros.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Responder