Otworzenie zewnętrznego pliku

0

Witam
Mam kolejny problem z którym średnio idzie mi walka. Chodzi o to, aby po naciśnięciu przycisku pojawił się MessageBox i po wybraniu "Tak/Yes" otworzył plik o rozszerzeniu .pdf. Wszystko oprócz samego otworzenia pliku mi wychodzi. Znajduje się on w lokalizacji programu.
Programuję w C++ w Visual Studio 2010.

Funkcja fopen i _wfopen nie pozwala się użyć (chyba, że brakuje mi bibliotek, ale nie wiem).

Pozdrawiam
Piotrek - franiis

0

Zdefiniuj "otworzył". Jak, gdzie? W twojej aplikacji, czy ma się otworzyć domyślna przeglądarka pdfów?

0

Chodzi mi o otworzenie w domyślnym zewnętrznym programie. Jeśli istnieje jakiś sposób na wszelkie rozszerzenia też byłoby dobrze :)

0

ShellExecute

0

Program będzie miał 3 linijki kodu w main. MessageBox(), ShellExecute i warunek...

0

http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153%28v=vs.85%29.aspx

Zgodnie z tym powinno działać coś takiego:

ShellExecute(handle, "open", "szyfr.pdf", NULL, NULL, 1);

Chyba muszę coś z 'HINSTANCE' tzrobić, ale nie wiem, jak można to wykorzystać.

EDIT:

Mam coś takiego w obecnej niedziałającej wersji;

System::Windows::Forms::DialogResult odp = MessageBox::Show("Czy otworzyć zewnętrzny plik?", "Otworzyć plik?", MessageBoxButtons::YesNo, MessageBoxIcon::Question);
if (odp==System::Windows::Forms::DialogResult::Yes) {ShellExecute(handle, "open", "szyfr.pdf", NULL, NULL, SW_SHOWNORMAL);}
0

A nie czasem:

ShellExecute(NULL, "open", "szyfr.pdf" , "" , "" , SW_SHOWNORMAL);

?
I zdefiniuj "nie działa"...

0

1>c:\documents and settings\piotr\moje dokumenty\visual studio 2010\projects\szyfrant12\szyfrant12\Form1.h(1663): error C2065: 'NULL' : undeclared identifier
1>c:\documents and settings\piotr\moje dokumenty\visual studio 2010\projects\szyfrant12\szyfrant12\Form1.h(1663): error C2065: 'SW_SHOWNORMAL' : undeclared identifier
1>c:\documents and settings\piotr\moje dokumenty\visual studio 2010\projects\szyfrant12\szyfrant12\Form1.h(1663): error C3861: 'ShellExecute': identifier not found

Błędy dotyczące tej linii - zastosowałem identycznie przepisaną od Shalom'a, czyli:

ShellExecute(NULL, "open", "szyfr.pdf", "", "", SW_SHOWNORMAL); 
0

#include <Windows.h>

0

Dodałem:

using namespace System::Windows;

ale błędy wyrzucane przez kompilator się nie zmieniły

0

Potrafisz czytać co się do ciebie pisze?

0

Czy jest ktoś w stanie mi podpowiedzieć, jak sobie z tym poradzić?

2

Perełka...
Rev Ci napisał jak dodać tą bibliotekę:
#include <Windows.h>

Piszesz aplikację okienkową a nawet nie wiesz w jakim języku...

0

Wiem, że mam to gdzieś dodać, ale nie mam pojęcia w której części kodu (jeśli w kodzie, a nie gdzieś przez properties). Dlatego też pytam o to.

0

na samym początku kodu.
minuta z google i sam byś znalazł odpowiedź.

0
#pragma once

namespace Szyfrant12 {

	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;
	using namespace System::IO;
	using namespace System::Windows;

	/// <summary>
	/// Summary for Form1
	/// </summary>
	public ref class Form1 : public System::Windows::Forms::Form
	{
	public:
		Form1(void)
		{
			InitializeComponent();
			//
			//TODO: Add the constructor code here
			//
		}

	protected:
		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		~Form1()
		{
			if (components)
			{
				delete components;
			}
		}

Oto mój początek kodu. A w Googlach wszelkie próby szukania rozbijają się na strukturalnym...

PS: Dodałem to jako using namespace, ale nie pomogło.

1

Jakim strukturalnym... to jest jakaś herezja co piszesz. using namespace to jest zupełnie co innego niż #include... proponuję poczytać o podstawach C++, potem w ogóle nauczyć się C++, a dopiero potem zabierać się za C++\CLI. Tak ten kod to jest C++\CLI, a nie zwykły C++ - to jest INNY język.

1

Po pierwsze, zdecyduj się czy chcesz pisać w C++ czy w C++/CLI.
Po drugie, #include używa się i jest potrzebne zarówno w C++ jak i C++/CLI. I to niezależnie czy chcesz pisać obiektowo czy nie.
Po trzecie, using namespace również używa się i jest potrzebne zarówno w C++ jak i C++/CLI, także niezależnie czy chcesz pisać obiektowo czy nie.
(skreślono)
Po piąte, dostałeś już odpowiedź by dodać #include <windows.h>.

0

Niestety zastosowanie powyższych rad nie wystarczyło do rozwiązania ogólnego problemu. Udało się (nie bez trudu) z #include <Windows.h>. Teraz mam coś takiego:

{ShellExecute(NULL, L"open",  L"C://szyfr.pdf", L"", L"", SW_SHOWNORMAL);}

Ale wyrzuca to dwa następujące błędy:

Error	5	error LNK2028: unresolved token (0A000011) "extern "C" struct HINSTANCE__ * __stdcall ShellExecuteW(struct HWND__ *,wchar_t const *,wchar_t const *,wchar_t const *,wchar_t const *,int)" (?ShellExecuteW@@$$J224YGPAUHINSTANCE__@@PAUHWND__@@PB_W111H@Z) referenced in function "private: void __clrcall Szyfrant12::Form1::button7_Click(class System::Object ^,class System::EventArgs ^)" (?button7_Click@Form1@Szyfrant12@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)	C:\Documents and Settings\Piotr\moje dokumenty\visual studio 2010\Projects\Szyfrant12\Szyfrant12\Szyfrant12.obj

Error	6	error LNK2019: unresolved external symbol "extern "C" struct HINSTANCE__ * __stdcall ShellExecuteW(struct HWND__ *,wchar_t const *,wchar_t const *,wchar_t const *,wchar_t const *,int)" (?ShellExecuteW@@$$J224YGPAUHINSTANCE__@@PAUHWND__@@PB_W111H@Z) referenced in function "private: void __clrcall Szyfrant12::Form1::button7_Click(class System::Object ^,class System::EventArgs ^)" (?button7_Click@Form1@Szyfrant12@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)	C:\Documents and Settings\Piotr\moje dokumenty\visual studio 2010\Projects\Szyfrant12\Szyfrant12\Szyfrant12.obj

Znalazłem opisy w msdn tych błędów, ale nie rozjaśniło mi to sprawy.

1

Prawy na projekt -> Properties -> Linker -> Input i upewnij się, że w "Additional Dependencies", np. w inherited values masz wartość "shell32.lib".

0

Bardzo dziękuję wszystkim za pomoc - w końcu się udało to rozgryźć (jeśli kogoś zdenerwowałem, to przepraszam). :]

1 użytkowników online, w tym zalogowanych: 0, gości: 1