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..