CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - ShellExecute - Ciekawostka

ShellExecute - Ciekawostka

dział ogólny

ShellExecute - Ciekawostka

Nowy postprzez Corvis » środa, 25 maja 2011, 08:27

Witam,

Mam funkcje:
KOD cpp:     UKRYJ  
ShellExecute(Handle, "open", "www.onet.pl", 0, 0, SW_SHOW);  

oraz:
KOD cpp:     UKRYJ  
String www = "www.onet.pl";
ShellExecute(Handle, "open", this->www.t_str(), 0, 0, SW_SHOW);    


W 1 przypadku wszystko chodzi bardzo dobrze. W 2 kompilator i program się zawieszają. Miał ktoś taki problem ?? Wie ktoś może o co tu chodzi ?

Pozdrawiam
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: ShellExecute - Ciekawostka

Nowy postprzez Slynx » środa, 25 maja 2011, 11:19

Nie powiem Ci dokładnie, bo nie mogę odpalić tej funkcji pod Visualem, ale widzę, że korzystasz ze Stringa. Zapis bez wskaźnika sugeruje, że albo to C# albo coś innego o czym nie wiem. Zanim wpiszesz tego stringa przekształconego, wrzuć go do jakiejś innej zmiennej i zatrzymaj debbugerem, zaraz po przypisaniu - zobacz czy rzeczywiście znajduje się tam poprawna wartość.
Nigdy nie używam funkcji t.str(), nie wiem czy i jak działa. U mnie zamiana z managed Stringa do native wygląda tak
KOD cpp:     UKRYJ  
                                 String^ www = "www.onet.pl";
                                 char *xxx = (char*)Runtime::InteropServices::Marshal::StringToHGlobalAnsi(www).ToPointer();
                                 std::string aaas = std::string(xxx);
 

Jak mówiłem, sprawdź czy w tym przekopiowanym stringu jest poprawna wartość.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: ShellExecute - Ciekawostka

Nowy postprzez Cyfrowy Baron » środa, 25 maja 2011, 15:35

Używasz zmiennej typu String, a ponieważ korzystasz ze środowiska Embarcadero RAD Studio XE to dla String domyślnym typem jest UnicodeString, a nie AnsiString, przekazując więc przez zmienną UnicodeString adres do domyślnej przeglądarki, przekazujesz go w Unicode, a przeglądarka nie akceptuje znaków Unicode w adresie, nawet jeżeli adres nie zawiera znaków Unicode, to funkcja ShellExecute i tak formatuje go na Unicode - stąd błąd.

KOD cpp:     UKRYJ  
HINSTANCE ShellExecute(
    HWND hwnd,
    LPCTSTR lpOperation,
    LPCTSTR lpFile,
    LPCTSTR lpParameters,
    LPCTSTR lpDirectory,
    INT nShowCmd
);
LPCSTR to typ ANSI - typedef __nullterminated CONST CHAR *LPCSTR;



Sprawdź czy tak też masz błąd:

KOD cpp:     UKRYJ  
 AnsiString www = "www.onet.pl";
ShellExecute(Handle, "open", this->www.c_str(), 0, 0, SW_SHOW);    
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: ShellExecute - Ciekawostka

Nowy postprzez Corvis » czwartek, 26 maja 2011, 08:02

Kod z AnsiStrigiem działa.

Ale przerobiłem swój tak:

KOD cpp:     UKRYJ  
String adres = "http://" + this->WWW;
ShellExecute(0, "open", adres.t_str(), 0, 0, SW_SHOW);


i też działa dobrze. Tak więc, ciężko mi naprawdę powiedzieć o co tu chodziło a może chodzi dalej :roll:
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: ShellExecute - Ciekawostka

Nowy postprzez Cyfrowy Baron » czwartek, 26 maja 2011, 14:41

To musi być jakiś bug środowiska XE, gdyż u mnie to działa:

Plik nagłówkowy np. Unit1.h
KOD cpp:     UKRYJ  
private:
        String www;


Plik źródłowy np. Unit1.cpp
KOD cpp:     UKRYJ  
 www = "www.onet.pl";
 ShellExecute(Handle, "open", this->www.t_str(), 0, 0, SW_SHOW);


By używać adresowania przez this zmienna musi być zadeklarowana w pliku nagłówkowym w sekcji private lub public.

Używasz funkcji t_str(), więc masz mapowanie ustawione na char?!

Sprawdziłem również z mapowaniem ustawionym na wchar_t i również działa bez problemu:

KOD cpp:     UKRYJ  
 www = "www.onet.pl";
 ShellExecuteW( Handle, L"open", this->www.c_str(), 0, 0, SW_SHOW);


Tak więc moja wcześniejsza teoria o tym, że błąd wywołuje używanie Unicode jest błędna.

U mnie wszystko działa poprawnie zarówno w kombinacji UnicodeString vs. char jak i UnicodeString vs. wchar_t.

U mnie domyślną przeglądarką jest Firefox, a u Ciebie Chrome, więc możliwe, że to wina przeglądarki, ale tak to już jest jak się używa jakichś podrzędnych przeglądarek.
Tak z ciekawości, czy w tej Chrome możesz blokować wszystkie reklamy, bo w Firefox tak?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: ShellExecute - Ciekawostka

Nowy postprzez Corvis » niedziela, 29 maja 2011, 18:19

Cyfrowy Baron napisał(a): Tak z ciekawości, czy w tej Chrome możesz blokować wszystkie reklamy, bo w Firefox tak?


Bladego pojęcia nie mam :-)

Co do tego problemu, nie mam pojęcia o co chodziło ale już działa :o
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: ShellExecute - Ciekawostka

Nowy postprzez Cyfrowy Baron » niedziela, 29 maja 2011, 19:02

Corvis napisał(a):Bladego pojęcia nie mam :-)


To nie jest wbudowana funkcja żadnej przeglądarki, lecz dodatkowa wtyczka AdBlock Plus, instalowana jako jeden z licznych dodatków do Firefox. Ponieważ jednak wtyczka blokuje reklamy Google, a Chrome to produkt Google to zapewne nie obsługuje tej wtyczki i jesteś niestety narażony na oglądanie reklam nie tylko w telewizji, ale również w sieci.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 11 gości