Página 1 de 2

Colocar programa residente na memória ?

Enviado: 18 Set 2008 09:53
por Grings
.

Re: Colocar programa residente na memória ?

Enviado: 18 Set 2008 10:39
por marcos.gurupi
Vc usa a hwgui? Eu sei q com ela eh possivel pq uso assim.

Marcos Roberto.

Re: Colocar programa residente na memória ?

Enviado: 18 Set 2008 10:50
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


.

Enviado: 18 Set 2008 11:52
por Grings
.

Re: Colocar programa residente na memória ?

Enviado: 19 Set 2008 12:11
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.

Re: Colocar programa residente na memória ?

Enviado: 19 Set 2008 15:03
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

Re: Colocar programa residente na memória ?

Enviado: 19 Set 2008 17:00
por sygecom
Show de Bola esse exemplo....

Re: Colocar programa residente na memória ?

Enviado: 19 Set 2008 23:50
por marcos.gurupi
Perfeito. Mas desculpe a ignorancia. Como eu poderia por exemplo monitorar algo com o exemplo acima?

Marcos Roberto

Re: Colocar programa residente na memória ?

Enviado: 20 Set 2008 19:21
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.

Re: Colocar programa residente na memória ?

Enviado: 21 Set 2008 19:39
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

Re: Colocar programa residente na memória ?

Enviado: 22 Set 2008 11:14
por rodrmigu
Eu testei com windows XP. Se alguém mais puder confirmar o funcionamento.

[]'s
Rodrigo

Re: Colocar programa residente na memória ?

Enviado: 22 Set 2008 15:12
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

Re: Colocar programa residente na memória ?

Enviado: 28 Set 2008 01:49
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"

Re: .

Enviado: 22 Set 2009 00:17
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

Re: Colocar programa residente na memória ?

Enviado: 23 Set 2009 19:46
por sygecom
Use o exemplo postado pelo Rodrigo Moreno, que é compilado direto com xHarbour e não precisa de aplicativos de terceiros.