Página 1 de 1

Forçar termino do processo !

Enviado: 14 Mai 2007 08:34
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

Enviado: 14 Mai 2007 14:52
por Euclides
Bira,
Consegue "ver" on nome do processo no "Gerenciador" ?
Euclides

Enviado: 14 Mai 2007 17:51
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.

Enviado: 14 Mai 2007 21:01
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

Forçar término AcroRD32.exe

Enviado: 18 Nov 2007 09:41
por zefilho
Bira,

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

O processo fica aberto !

Enviado: 18 Nov 2007 10:22
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.

Enviado: 18 Nov 2007 14:45
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.

Enviado: 18 Nov 2007 14:57
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 ???

Enviado: 18 Nov 2007 18:24
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.

Enviado: 19 Nov 2007 14:50
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..