Colocar programa residente na memória ?
Moderador: Moderadores
Colocar programa residente na memória ?
.
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

- Mensagens: 939
- Registrado em: 06 Jul 2004 11:53
- Localização: Gurupi-TO
Re: Colocar programa residente na memória ?
Vc usa a hwgui? Eu sei q com ela eh possivel pq uso assim.
Marcos Roberto.
Marcos Roberto.
Marcos Roberto
NetService Software
NetService Software
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: Colocar programa residente na memória ?
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:
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
xHarbour.org + Hwgui + PostgreSql
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: Colocar programa residente na memória ?
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.
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 537 vezes
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
Re: Colocar programa residente na memória ?
Olá Grings,
Você pode tentar usar services, algo assim:
Para instalar o serviço, digite:
meu_programa.exe -i
para remover
meu_programa.exe -d
[]'s
Rodrigo
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
meu_programa.exe -i
para remover
meu_programa.exe -d
[]'s
Rodrigo
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: Colocar programa residente na memória ?
Show de Bola esse exemplo....
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
-
marcos.gurupi
- 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 ?
Perfeito. Mas desculpe a ignorancia. Como eu poderia por exemplo monitorar algo com o exemplo acima?
Marcos Roberto
Marcos Roberto
Marcos Roberto
NetService Software
NetService Software
Re: Colocar programa residente na memória ?
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:
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.
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
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 ?
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
Abraco
Evaldo
Re: Colocar programa residente na memória ?
Eu testei com windows XP. Se alguém mais puder confirmar o funcionamento.
[]'s
Rodrigo
[]'s
Rodrigo
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: Colocar programa residente na memória ?
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
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
xHarbour.org + Hwgui + PostgreSql
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Re: Colocar programa residente na memória ?
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.
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.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Re: .
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
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
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: Colocar programa residente na memória ?
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
xHarbour.org + Hwgui + PostgreSql


