19. januar 2004 - 18:21Der 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).
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.
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.
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.
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.
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.
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.