Clipper On Line • Ver Tópico - Forçar termino do processo !

Forçar termino do processo !

Discussão sobre a biblioteca Fivewin - O Clipper para Windows.

Moderador: Moderadores

 

Forçar termino do processo !

Mensagempor bira » 14 Mai 2007 08:34

Amigos estou usando a seguinte função para abrir um arquivo PDF via activex, porém, ao fechar o documento o processo continua ativo no WINDOWS, e depois de abrir algumas vezes o ADOBE PDF me da uma mensagem, dizendo que o numero maximo de arquivos foi aberto.
Assim sendo, preciso forçar o termino do processo, Mais gostaria que isso fosse via código e não por EXE externo.

function pdfMain(Nomerel)
   local poWnd, oActiveX,IDPDF:=""

   IF ! PDFActivex(@IDPDF)
      RETURN(.F.)
   ENDIF
   
   nomerel:=if(nomerel=nil,"PDF Relatório",nomerel)

   DEFINE WINDOW poWnd TITLE  ".::"+alltrim(sis_1nom)+"::. "+nomerel+" - "+IDPDF

   oActiveX = TActiveX():New( poWnd, IDPDF ) 

   poWnd:oClient = oActiveX // To fill the entire window surface

   oActiveX:Do( "LoadFile", "genesis.pdf" )
   oActiveX:Do( "SetCurrentPage", 1 )

   ACTIVATE WINDOW poWnd MAXIMIZED

return nil


Um abraço

Bira
xharbour 1.1.0 + FWH 9.02 + SQLLIB + SQLRDD + MYSQL + PELLES + WORKSHOP + XMATE + EMS
bira
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 17
Data de registro: 28 Jul 2004 10:58
Cidade/Estado: SÃO PAULO
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Mensagempor Euclides » 14 Mai 2007 14:52

Bira,
Consegue "ver" on nome do processo no "Gerenciador" ?
Euclides
Euclides
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 154
Data de registro: 12 Mai 2007 14:07
Cidade/Estado: São Paulo, Capital
Curtiu: 1 vez
Mens.Curtidas: 14 vezes

Mensagempor rochinha » 14 Mai 2007 17:51

Amiguinhos

Realmente isto pode ocorrer pois o processo continua na memória afim de agilizar a abertura mas muitas vezes ocorre que o mesmo ao ser chamado novamente pega outro processo e esquece o anterior.

Ao finalizar um processo aberto com tActivex ou TOleAuto() voce pode descarrega-lo com Close() ou End():

...
ACTIVATE WINDOW poWnd MAXIMIZED VALID MsgYesNo(´Quer terminar?´,(oActiveX:End(),.f.),.t.)
...


Verifique o método correto de fechar uma janela usando VALID pois coloquei de cabeça.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4545
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 806 vezes
Mens.Curtidas: 245 vezes

Mensagempor bira » 14 Mai 2007 21:01

Sim Euclides, o nome é AcroRd32.exe, consegui no forum FW um EXE chamado KILLPROCESS(pascal), com ele consigo matar o processo, sem ele já tentei tudo e nada finaliza o processo.
Rochinha, já tentei a sua sujestão e não funcionou!

Agradeço a atenção

Bira
xharbour 1.1.0 + FWH 9.02 + SQLLIB + SQLRDD + MYSQL + PELLES + WORKSHOP + XMATE + EMS
bira
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 17
Data de registro: 28 Jul 2004 10:58
Cidade/Estado: SÃO PAULO
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Forçar término AcroRD32.exe

Mensagempor zefilho » 18 Nov 2007 08:41

Bira,

Estou com o mesmo problema q vc. Vc conseguiu resolver como ?

O processo fica aberto !
zefilho
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 12
Data de registro: 14 Nov 2007 06:21
Cidade/Estado: João Pessoa-PB
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Mensagempor Maligno » 18 Nov 2007 09:22

Tenho isso no fonte (público) da biblioteca WAPI, usada no Clipper. Como é em C, será fácil adaptar. A função encerra qualquer processo pelo nome do EXE ou pelo seu handle. Ou, se alguém preferir fazer, usa-se a função TerminateProcess() da API do Windows.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar de usuário

Maligno
Membro Master

Membro Master
 
Mensagens: 6390
Data de registro: 06 Jul 2004 01:40
Cidade/Estado: Londrina/PR
Curtiu: 1 vez
Mens.Curtidas: 14 vezes

Mensagempor zefilho » 18 Nov 2007 13:45

Vc pode postar como seria uma linha de comando com Afunção TerminateProcess() da API do windows?

Estou usando o xHarbour 0.99.70.
zefilho
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 12
Data de registro: 14 Nov 2007 06:21
Cidade/Estado: João Pessoa-PB
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Mensagempor zefilho » 18 Nov 2007 13:57

Rochinha,

A classe TAcvtivex() não possui os métodos end() e close().

Pelo menos no arquivo TAxPrg.prg que tem na pasta C:\MiniGUI\SAMPLES\Advanced\PDFReader da MINIGUI que baixei.

O código está assim :
[DEFINE WINDOW FORMPDFREADER ;
       AT 0, 0 ;
       WIDTH 800 HEIGHT 800 ;
       TITLE "MTRAB.NET - PDF Reader";
       NOSIZE;
       NOMAXIMIZE;
       NOMINIMIZE;
       MAIN ;
       ICON 'ADOBE.ICO' ;
       ON INIT fOpenActivex(cFilePDF) ;
       ON RELEASE fCloseActivex()
END WINDOW]

E o código das 2 funções é o seguinte :
[Static Procedure fOpenActivex(cFilePdf)
LOCAL cPDF:=cFilePdf
IF FILE(cPDF)
   oWActiveX := TActiveX():New(ThisWindow.Name, ;
                               "AcroPDF.PDF.1", ;
                               0, ;
                               0, ;
                               GetProperty(ThisWindow.Name, "width") -  02 * GetBorderWidth() - 1 , ;
                               GetProperty(ThisWindow.Name, "height") - 05 * GetBorderHeight() - ;
                                                                             GetTitleHeight() - ;
                                                                             GetMenuBarHeight() )

   oActiveX := oWActiveX:Load()
   oActiveX:LoadFile(cPDF)
ELSE
   MsgStop("Arquivo PDF não encontrado.")
   FORMPDFREADER.Release()
ENDI

Return
********************
STAT FUNC fCloseActivex()

IF VALTYPE(oWActivex) <> "U" .AND. VALTYPE(oActivex) <> "U"
   oWActivex := Nil
   oActivex := Nil
ENDI

RETU NIL]
Desse jeito, a janela é encerrada mas o processo AcroRd32.exe não.

A aplicação está rodando num TS. E o que aconetce é que a conexão não é encerrada assim que o programa é encerrado pq o processo fica sendo executado ainda.

Qual a solução pra isso ???
zefilho
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 12
Data de registro: 14 Nov 2007 06:21
Cidade/Estado: João Pessoa-PB
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Mensagempor Maligno » 18 Nov 2007 17:24

zefilho escreveu:Vc pode postar como seria uma linha de comando com Afunção TerminateProcess() da API do windows?

Estou usando o xHarbour 0.99.70.

A função pronta:

void KillApplication(char *Args) {
    HWND  Handle;
    char *FileName = strstr(Args,_kARGS_SEP);

    if (FileName) {
        strupr(++FileName);
        PROCESSENTRY32 ProcessEntry;
        HANDLE SnapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
        ProcessEntry.dwSize = sizeof(ProcessEntry);

        if (Process32First(SnapshotHandle,&ProcessEntry)) {
            do {
                if (strstr(strupr(ProcessEntry.szExeFile),FileName)) {
                    TerminateProcess(OpenProcess(1,0,ProcessEntry.th32ProcessID),0);
                }
            } while(Process32Next(SnapshotHandle,&ProcessEntry));
        }
    }
    else {
        Handle = (HWND)atol(Args);
        DWORD ProcessID;
        GetWindowThreadProcessId(Handle,&ProcessID);
        if (ProcessID) {
            TerminateProcess(OpenProcess(1,0,ProcessID),0);
        }
    }
    return;
}


No site da MSN, clique aqui pra ver o help da função TerminateProcess().
Quando precisar de algum help, utilize o mecânismo de pesquisa, que você poderá encontrar help pra tudo o que diz respeito às APIs do Windows.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar de usuário

Maligno
Membro Master

Membro Master
 
Mensagens: 6390
Data de registro: 06 Jul 2004 01:40
Cidade/Estado: Londrina/PR
Curtiu: 1 vez
Mens.Curtidas: 14 vezes

Mensagempor ICO » 19 Nov 2007 13:50

Qual o problema de fecha-lo com o Killprocess ??
Carregue ele dentro de uma function,e para q funcione retire o return nil.

OU APENAS INCLUDA ISTO

WaitRun("KillProc.exe PROCESSOADESTRUIR.EXE",2)
(GlobalFree(),ResAllFree(),FreeResources(),SysRefresh())

onde processoadestruir = nome do processo que vc. deseja matar..




Abraços..
Luiz Arruda-Corumba - MS
FiveWin 9.04
[x]Harbour
PellesC
xDev
BCC
Ws

[blue]Retorne avisando se a Dica Funcionou[/blue]

email: ico.corumba@gmail.com
Avatar de usuário

ICO
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 45
Data de registro: 01 Ago 2007 15:59
Cidade/Estado: Corumba - MS
Curtiu: 0 vez
Mens.Curtidas: 0 vez




Retornar para FiveWin

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 3 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro