Forçar termino do processo !

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

Moderador: Moderadores

bira
Usuário Nível 1
Usuário Nível 1
Mensagens: 22
Registrado em: 28 Jul 2004 10:58
Localização: SÃO PAULO

Forçar termino do processo !

Mensagem por bira »

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.

Código: Selecionar todos

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
Euclides
Usuário Nível 3
Usuário Nível 3
Mensagens: 154
Registrado em: 12 Mai 2007 14:07
Localização: São Paulo, Capital

Mensagem por Euclides »

Bira,
Consegue "ver" on nome do processo no "Gerenciador" ?
Euclides
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

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():

Código: Selecionar todos

...
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 [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.
bira
Usuário Nível 1
Usuário Nível 1
Mensagens: 22
Registrado em: 28 Jul 2004 10:58
Localização: SÃO PAULO

Mensagem por bira »

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
zefilho
Usuário Nível 1
Usuário Nível 1
Mensagens: 12
Registrado em: 14 Nov 2007 07:21
Localização: João Pessoa-PB

Forçar término AcroRD32.exe

Mensagem por zefilho »

Bira,

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

O processo fica aberto !
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

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!
zefilho
Usuário Nível 1
Usuário Nível 1
Mensagens: 12
Registrado em: 14 Nov 2007 07:21
Localização: João Pessoa-PB

Mensagem por zefilho »

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
Registrado em: 14 Nov 2007 07:21
Localização: João Pessoa-PB

Mensagem por zefilho »

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 :

Código: Selecionar todos

[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 :

Código: Selecionar todos

[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 ???
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

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:

Código: Selecionar todos

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!
ICO
Usuário Nível 1
Usuário Nível 1
Mensagens: 45
Registrado em: 01 Ago 2007 15:59
Localização: Corumba - MS

Mensagem por ICO »

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
Responder