Avatar billede stigc Nybegynder
06. maj 2000 - 23:01 Der er 6 kommentarer og
1 løsning

åbne en fil type.

Jeg ønsker i Borland builder c++, at åbne en fil med det program som windows har tilknyttet filen.

F.eks skal mit program åbne en mp3 i programmet winamp, hvis det er det tilknyttet program. Hvordan gør man dette?
Avatar billede soepro Nybegynder
08. maj 2000 - 09:34 #1
Sådan her:

shellExe = ShellExecute(Application->Handle, "open", fileName,
                          /*Parms*/ NULL, dftPath, SW_SHOWNORMAL);
  if ((int)shellExe <= 32L)
    Application->MessageBox("Filen" + fileName +
                            "kunne IKKE startes automatisk.",
                            "Fejl under opstart",
                            MB_ICONERROR | MB_OK);

fileName indeholder navnet på den fil du vil behandle, f.eks. en .MP3 fil. Du skal finde en detaljeret beskrivelse af kaldet i Win SDK hjælpen unde MSHELP folderen.
Avatar billede soepro Nybegynder
08. maj 2000 - 09:44 #2
shellExe er af typen HINSTANCE (dvs. i virkeligheden en VOID*), men bliver også brugt til at returnere en fejlkode - derfor caster jeg den til (int) når det skal checkes om den er <= 32. (Hvilket betyder fejl.) Hvis den er > 32 gik kaldet godt.

Bemærk at dit program jo altså kører videre, hvis opstarter lykkes - du får så blot startet endnu et program. (Jeg lader mit program minimere sig selv i den situation, via frmMain->WindowState = wsMinimized.)
Avatar billede stigc Nybegynder
08. maj 2000 - 20:31 #3
Ok det ser ud som om det er det jeg leder efter, men det virker ikke hos mig. Jeg bruger Borland builder 4.0, og du skal regne med at jeg ikke er særlig god til det.   

Jeg forstår at følgende danner en fejlbox ved enventuel fejl. Denne del kompilerer helt fint:

  if ((int)shellExe <= 32L)
    Application->MessageBox("Filen" + fileName +
                "kunne IKKE startes automatisk.",
                "Fejl under opstart",
                MB_ICONERROR | MB_OK);

Resten må så være det der "launcher en fil":

shellExe = ShellExecute(Application->Handle, "open", fileName,
            /*Parms*/ NULL, dftPath, SW_SHOWNORMAL);

Kompileren siger at:

[C++ Error] Unit1.cpp(21): E2451 Undefined symbol 'shellExe'.
[C++ Error] Unit1.cpp(21): E2268 Call to undefined function 'ShellExecute'.
[C++ Error] Unit1.cpp(22): E2451 Undefined symbol 'dftPath'.
[C++ Warning] Unit1.cpp(22): W8074 Structure passed by value.

Hvad er der galt?
Avatar billede soepro Nybegynder
09. maj 2000 - 10:23 #4
Ovenstående er klippet ud af en sammenhæng - jeg troede du kunne gætte dig til hvad du skulle erstatte med dit eget kode.

Du mangler at inkludere de nødvendige header filer (først i koden - f.eks. efter '#include <vcl.h>' i toppen af modulet):

#include <stdlib.h>
#include <shellapi.h>

samt definere et par variabler (i den event handler hvor du skal bruge koden):

HINSTANCE shellExe;
char            dftPath[MAXPATH];

'dftPath' variablen skal indeholde den sti som du ønsker at programmet skal "se" som nuværende path når det kører. (Hvis du f.eks. vil starte Microsoft Word op, og have det til at "se" direkte ned i folderen 'C:\DOKUMENTER\MSWORD', så skal du initialisere dftPath sådan her:

sprintf(dftPath, "C:\\DOKUMENTER\\MSWORD\\");

Et fungerende eksempel kunne være (idet jeg antager at du har en knap på din form der hedder Button1):

#include <vcl.h>
#include <stdlib.h>
#include <shellapi.h>
#pragma hdrstop
:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  HINSTANCE shellExe;
 
  shellExe = ShellExecute(Application->Handle, "open", "C:\\Dokumenter\\MSWord\\dokument1.doc",
          NULL , "C:\\Dokumenter\\MSWord\\", SW_SHOWNORMAL);

if ((int)shellExe <= 32L)
Application->MessageBox("Filen" + "C:\\Dokumenter\\MSWord\\Dokument1.doc" +
                                    "kunne IKKE startes automatisk.",
                                    "Fejl under opstart",
                                    MB_ICONERROR | MB_OK);
else
  Form1->WindowState = wsMinimized;'
} // Button1Click
Avatar billede stigc Nybegynder
04. juni 2000 - 19:20 #5
Mange tak for hjælpen. Ved du hvordan man kan lukke det program man har startet?
Avatar billede stigc Nybegynder
04. juni 2000 - 19:23 #6
Jeg skylder lige at fortælle dig at det virker fint, Jeg brugte følgende kode:

#include <shellapi.h>

HINSTANCE shellExe = ShellExecute(Handle, "open", "test.mp3", NULL, NULL , SW_HIDE);
  if ((int)shellExe <= 32L)
  Application->MessageBox(
                            "kunne IKKE startes automatisk.",
                            "Fejl under opstart",
                          MB_ICONERROR | MB_OK);


Smart at man kan gemme det program man starter. Men det ville være fedt at kunne lukke det igen. Hvordan? 100 point hvis jeg får svar på det!
Avatar billede soepro Nybegynder
06. juni 2000 - 08:19 #7
Jeg mener du kan checke på om den process du startede (hvis handle havner i shellExe) stadig kører - og dermed lade programmet vente på det. Check Windows SDK hjælpen - eller skriv igen.
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