Avatar billede rhovdyr Nybegynder
19. januar 2004 - 18:21 Der er 9 kommentarer og
1 løsning

Redigere word/excel filer via en applikation og gemme dem igen

Hej,

Jeg har en lille applikation der kan hente/gemme filer fra/i en
database. Endvidere kan den gemme dem temporært på disken
og kan starte default applikationen der kan visualisere dem
via flg. kode i Visual C++ (MFC) :

--- kode ---

//Start the default viewer
int resultVal = (int) ShellExecute(NULL, "open", fileName.c_str(), NULL, NULL, SW_SHOWNORMAL);

--- kode ---

Det drejer sig primært omkring word og excel filer
(men det ville være dejligt at lave en generel løsning).

Nu vil jeg gerne udvide det til at jeg også kan rette i
filerne fra databasen i applikationen der startede op, og
når man afslutter programmet så gemme den rettede fil i
databasen igen.

Problemet er at fange at brugeren afslutter applikationen
igen. Jeg har kigget på at lave noget med
at se på hvornår filen ændrer sig, men det virker ikke
super godt, f.eks hvis man kun saver filen (og ikke
afslutter) så går det helt i kage.

Som sagt er det primært word og excel filer der er super
vigtige (altså hvis det ikke er muligt at lave en
generel metode).
Avatar billede bertelbrander Novice
19. januar 2004 - 18:25 #1
Hvis du bruger ShellExecuteEx() til at starte applikationen får du en hProcess som du kan bruge i et kald til GetExitCodeProcess().
Avatar billede rhovdyr Nybegynder
19. januar 2004 - 18:39 #2
Hej Bertel,

Du mener i argurmentet LPSHELLEXECUTEINFO til ShellExecuteEx().

Men hvis jeg nærlæser det så lyder det til at hvis word f.eks. allerede
er åbnet. Så vil hProcess være NULL ?

Fra msdn :

Handle to the newly started application. This member is set on return and is always NULL unless fMask is set to SEE_MASK_NOCLOSEPROCESS. Even if fMask is set to SEE_MASK_NOCLOSEPROCESS, hProcess will be NULL if no process was launched. For example, if a document to be launched is a URL and an instance of Microsoft Internet Explorer is already running, it will display the document. No new process is launched, and hProcess will be NULL.
Avatar billede bertelbrander Novice
19. januar 2004 - 19:45 #3
Jo, der er et problem hvis ShellExecuteEx() ikke starter en ny process.

Man kunne måske bruge EnumWindows() til at finde det vindue som dokumentet er åbnet i, og så vente på at dette vindue lukker. I callback funktionen kan man bruge GetWindowText() til at få fat i titlen på vinduet, normalt den text der står i bjælken øverst, words og exec plejer at have titlen på dokumentet til at stå der, men det er ikke alle programmer der har det.
Avatar billede rhovdyr Nybegynder
20. januar 2004 - 08:56 #4
Hej igen,

Jeg er glad for svar, men det lyder ikke som en særlig stabil løsning :-)

Kender du evt. andre måder jeg kan starte applikationerne op ?
Evt. at jeg laver en speciel start for .doc og .xls filer, som er dem
det er vigtigst for. Resten må jeg så klare på anden vis.
Avatar billede bertelbrander Novice
20. januar 2004 - 19:08 #5
Jeg ved ikke om løsningen er stabil nok, hvis ikke bliver du nok nødt til at lege detektiv og rode lidt i beskeder og view's på forskellige vinduer.
Til det brug er spyxx.exe og venner fra "...\Microsoft Visual Studio\Common\Tools" velegnet, men om du får en meget mere stabil løsning ved det er usikkert.
Avatar billede coldplay Nybegynder
20. januar 2004 - 23:59 #6
HWND hwnd = GetActiveWindow();

SHELLEXECUTEINFO info;
memset(&info, 0, sizeof(info));
info.cbSize = sizeof(info);
info.lpVerb = "open";
   
info.lpFile = fileName.c_str()
   
info.lpParameters = "";

info.fMask = SEE_MASK_NOCLOSEPROCESS;
info.nShow = SW_SHOWDEFAULT;

ShellExecuteEx(&info);

ShowWindow(hwnd, SW_MINIMIZE);

WaitForSingleObject(info.hProcess,  INFINITE);

ShowWindow(hwnd, SW_RESTORE);

***********************************

WaitForSingleObject venter indtil den kaldte applikation afsluttes af bruger.

Den kaldende applikation minimeres før kaldet til WaitForSingleObject og genskabes
efter WaitForSingleObject har returneret.

Årsagen til dette er:

Mens WaitForSingleObject kaldet venter på at returnere, er den kaldende applikation ude af stand til at genskabe sit vindue, hvis og såfremt vinduet bliver flyttet eller
overlappet af den kaldte applikation.
Avatar billede rhovdyr Nybegynder
26. januar 2004 - 09:31 #7
Hej bertelbrander og coldplay,

Jeg er p.t. lige lidt hængt op, og skal lige
bruge noget tid på at teste løsningsmulighederne.
Jeg skal nok vende tilbage med "point-givning" :-).
Avatar billede rhovdyr Nybegynder
07. juni 2004 - 16:32 #8
Så blev der tid. Det ser umiddelbart ud som om det virker.
Resten bliver at fedte det til.
Avatar billede rhovdyr Nybegynder
07. juni 2004 - 16:33 #9
Tildeling
Avatar billede rhovdyr Nybegynder
07. juni 2004 - 16:35 #10
Fattede ikke lige hvordan man tildelte point :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester