se eu sei alguma coisa de clipper e xHarbour, o mérito é todo de vocês.
Então, uma singela contribuição.
Não é nada de novo ou mirabolante, é simplesmente uma função xHarbour que chama uma api do Wndows para executar qualquer programa 32 bits.
A vantagem é que funciona com base no Shell do Windows, ou seja, se você passar apenas o nome do arquivo, ela chama o aplicativo respectivo associado.
Síntese:
ShellExecuteEx(nomedoaplicativo,nomedoarquivo)
Exemplo:
ShellExecuteEx(nil,"teste.txt")
Essa chamada, considerando a instalação padrão do Windows, vair abrir o arquivo teste.txt com o notepad, se ele tiver menos de 64K.
Se tiver mais, o wordpad vai ser usado.
ShellExecuteEx(nil,"teste.doc")
Essa chamada, considerando a instalação padrão do Windows, vair abrir o arquivo teste.doc com o word.
ShellExecuteEx("wordpad.exe","teste.rtf")
Essa chamada, vai tentar abrir o arquivo teste.rtf com o wordpad, se outro aplicativo não estiver associado a extensão.
ShellExecuteEx("calc.exe",nil)
Essa chamada executa a calculadora do Windows.
Dica: eu configurei a função para, primeiro, tentar abrir o arquivo passado com o aplicativo associado pelo windows.
Então, não adiante querer abrir um .txt com o word ou um .doc com o wordpad em uma instalação padrão.
Mas com isso, você cria um arquivo com uma extensão somente sua (que tal MGS), e o executa através de qualquer aplicativo.
ShellExecuteEx("winword.exe","teste.mgs")
Essa chamada, considerando a inexistência de referência para a extensão .mgs, vair abrir o arquivo teste.mgs com o word.
Se você quiser liberdade total, "santo perfeccionismo", mude as referências hb_parc abaixo.
Ou então, mais lógico né, associe a extensão do arquivo ao aplicativo windows que deve abrí-lo.
txt=wordpad
doc=word
rtf=wordpad
xls=excel
e aí vai
Código: Selecionar todos
#pragma BEGINDUMP
#include <conio.h>
#include <windows.h>
#include <winbase.h>
#include <hbapi.h>
HB_FUNC( SHELLEXECUTEEX )
{
SHELLEXECUTEINFO sei;
sei.cbSize = sizeof(sei);
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.lpVerb = "open";
sei.lpFile = hb_parc(2);
sei.nShow = SW_SHOW;
if (ShellExecuteEx(&sei))
{
WaitForSingleObject(sei.hProcess,INFINITE);
hb_retl(TRUE);
}
else
{
sei.lpFile = hb_parc(1);
sei.lpParameters = hb_parc(2);
if (ShellExecuteEx (&sei))
{
WaitForSingleObject(sei.hProcess,INFINITE);
hb_retl(TRUE);
}
}
}
#pragma ENDDUMPMarceloG
De Divinópolis/MG para o mundo.
:)Pos


