[C++] otevření .html souboru v prohlížeči

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod OgyDoggy 6. 6. 2010 12:41

potřeboval bych poradit, jak otevřít .html soubor v defaultním prohlížeči systému. zatím jsem nepřišel jak na to :(
učím se co můžu, učím se celý život, snad mi to k něčemu bude
OgyDoggy
Junior
Uživatelský avatar

Odeslat příspěvekod MiliNess 6. 6. 2010 12:50

Pokud se ti jedná o Windows, tak třeba pomocí ShellExecute
http://support.microsoft.com/kb/224816/cs
Hardwarová nezávislost znamená, že to neběží na žádném počítači.
MiliNess
Pokročilý

Odeslat příspěvekod OgyDoggy 6. 6. 2010 19:22

děkuju, koukl jsem se na to a asi dělám něco špatně. můžu to takhle volat z jednoduché konzolové aplikace? nebo to musí být okenní?

Kód: Vybrat vše
#include <iostream>
#include <string>
#include <windows.h>
#include <shellapi.h>

int main()
{
   ShellExecute(NULL, "open", "http://www.neco.nic/", NULL, NULL, SW_SHOWNORMAL);

   system("pause");
   return 0;
}


takhle to píše chybu error C2664: 'ShellExecuteW' : cannot convert parameter 2 from 'const char [5]' to 'LPCWSTR' pročpak?

kdybych napsal volání

ShellExecute(NULL, "open", "index.html", NULL, NULL, SW_SHOWNORMAL);

tak by se mi otevřel soubor index.html umístěný spolu s tím dejme tomu program.exe ve stejné složce?
učím se co můžu, učím se celý život, snad mi to k něčemu bude
OgyDoggy
Junior
Uživatelský avatar

Odeslat příspěvekod MiliNess 6. 6. 2010 20:52

Páč máš založený Unicode project. ShellExecute je makro, které při kompilaci expanduje buď na ANSI funkci ShellExecuteA (v případě kódování Multibyte), která jako druhý parametr přijímá ANSI řetězec nebo na ShellExecuteW (v případě kódování Unicode) která přijímá unicode řetězec.

Takže buď ve vlastnostech projektu přenastavíš Unicode charset na Multibyte charset nebo funkci předáš unicode řetězec.
ShellExecute(NULL, L"open", "index.html", NULL, NULL, SW_SHOWNORMAL);

Pokud nespecifikuješ plnou cestu k tomu html souboru a jako lpDirectory nepředáš cestu ke složce, kde se má soubor hledat, použije se aktuální složka, obvykle to bývá ta, ze které je program spuštěn. V některých případech to tak ale nemusí být. Proto dávám přednost předání plné cesty k souboru.
Naposledy upravil MiliNess dne 6. 6. 2010 21:17, celkově upraveno 1
Hardwarová nezávislost znamená, že to neběží na žádném počítači.
MiliNess
Pokročilý

Odeslat příspěvekod OgyDoggy 6. 6. 2010 21:02

děkuju
učím se co můžu, učím se celý život, snad mi to k něčemu bude
OgyDoggy
Junior
Uživatelský avatar

Odeslat příspěvekod MiliNess 6. 6. 2010 21:20

Plnou cestu ke složce s exe souborem získáš pomocí GetModuleFileName a jméno souboru odstraníš třeba pomocí PathRemoveFileSpec
Hardwarová nezávislost znamená, že to neběží na žádném počítači.
MiliNess
Pokročilý

Odeslat příspěvekod AmarLite 12. 5. 2012 22:33

Zdravím,

mám stejný problém, akorát v C++ MFC. Potřeboval bych otevřít soubor po kliknutí na tlačítko. Mám to už vnořený dialog, vypadá to nějak takhle:
Kód: Vybrat vše
// Sekce01b.cpp : implementation file
//

#include "stdafx.h"
#include "MyProgram.h"
#include "Sekce01b.h"
#include "afxdialogex.h"


// Sekce01b dialog

IMPLEMENT_DYNAMIC(Sekce01b, CDialog)

Sekce01b::Sekce01b(CWnd* pParent /*=NULL*/)
   : CDialog(Sekce01b::IDD, pParent)
{

   EnableAutomation();

}

Sekce01b::~Sekce01b()
{
}

void Sekce01b::OnFinalRelease()
{
   // When the last reference for an automation object is released
   // OnFinalRelease is called.  The base class will automatically
   // deletes the object.  Add additional cleanup required for your
   // object before calling the base class.

   CDialog::OnFinalRelease();
}

void Sekce01b::DoDataExchange(CDataExchange* pDX)
{
   CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(Sekce01b, CDialog)
   ON_BN_CLICKED(IDC_MFCBUTTON1, &Sekce01b::OnBnClickedMfcbutton1)
END_MESSAGE_MAP()

BEGIN_DISPATCH_MAP(Sekce01b, CDialog)
END_DISPATCH_MAP()

// Note: we add support for IID_ISekce01b to support typesafe binding
//  from VBA.  This IID must match the GUID that is attached to the
//  dispinterface in the .IDL file.

// {CC0DC276-F26A-4171-ABB4-541CE5661EBA}
static const IID IID_ISekce01b =
{ 0xCC0DC276, 0xF26A, 0x4171, { 0xAB, 0xB4, 0x54, 0x1C, 0xE5, 0x66, 0x1E, 0xBA } };

BEGIN_INTERFACE_MAP(Sekce01b, CDialog)
   INTERFACE_PART(Sekce01b, IID_ISekce01b, Dispatch)
END_INTERFACE_MAP()


// Sekce01b message handlers


void Sekce01b::OnBnClickedMfcbutton1()
{
   // TODO: Add your control notification handler code here
}


Poradili byste mi, co bych měl zadat jako akci po stisku tlačítka, abych mohl nějaký soubor otevřít (jednalo by se o pdf, otevřené např. v Adobe Readeru)?

Děkuji
AmarLite
Kolemjdoucí


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků