Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Problem med ShellExecute

Postades av 2008-06-25 10:25:31 - Fredrik Hofflander, i forum c++, Tråden har 6 Kommentarer och lästs av 1729 personer

Hej

Försöker köra ett enkelt Shellexecute-kommando men får det inte att fungera:

HINSTANCE a = ShellExecute(NULL,"open","calc.exe","","", SW_SHOW );

ger felet
error C2664: 'ShellExecuteW' : cannot convert parameter 2 from 'const char [5]' to 'LPCWSTR'

skriver jag
HINSTANCE a = ShellExecute(NULL, (LPCWSTR) "open", (LPCWSTR) "calc.exe","","", SW_SHOW );

blir a==ERROR_FILE_NOT_FOUND

Har testat mängder med olika sätt, filer, sökvägar mm men inget verkar funka. system("start calc.exe") funkar, men jag vill inte använda system...

Någon som har en idé?

Tack!
/Fredrik


Svara

Sv: Problem med ShellExecute

Postades av 2008-06-25 10:39:22 - Niklas Jansson

http://www.google.se/search?q=LPCWSTR ;-)

Så länge det är hårdkodade strängar kör du bara med

L"open"

istället för

"open"

EDIT:
För övrigt - varför vill du inte använda "system"?
ShellExecute fungerar bara i windows, medan system är någorlunda standard.


Svara

Sv:Problem med ShellExecute

Postades av 2008-06-25 12:33:28 - Fredrik Hofflander

Fick inte riktigt ShellExecute att fungera som jag ville så jag kör väl på system ändå (kändes lite onödigt att starta fler processer än nödvändigt). Nu kommer jag fram till nästra problem då. System returnerar ingen "FILENOTFOUND" eller liknande vad jag har förstått det som (den skriver iof ut att filen inte finns, men jag måste få reda på det i koden också). Jag har testat följande kod:

FILE* fp = NULL;
const char* filename = (clientPackage.getMessage()).c_str();
fp = fopen(filename, "rb");
if( fp != NULL )
{
fclose( fp );
//FILE EXIST
const char* systemMessage = ("start " + clientPackage.getMessage()).c_str();
system (systemMessage);
}else{
//FILE DOESN´T EXIST
cout << "File doesn´t exist" << endl;
}

Där clientPackage.getMessage() returnerar en string innehållande hela sökvägen till filen (ex, "c:\windows\notepad.exe"). Problemet är att fp alltid verkar bli NULL vad jag än anger för sökväg. När jag debugade verkade det som om filename blev "0". Men jag hittar inget fel på
const char* filename = (clientPackage.getMessage()).c_str();

/Fredrik


Svara

Sv: Problem med ShellExecute

Postades av 2008-06-25 12:58:23 - Niklas Jansson

Det är för att c_str är en pekare. Du måste antingen kopiera innehållet eller använda string. Fast det borde fungera ändå, eftersom c_str-pekare fortfarande bör fungera. Å andra sidan tilldelar du till en const char, vilket känns lite halvt wacky i det här fallet.

Sen är frågan varför du kör med fopen istället för fstream?



Det känns som att du gör för mycket på en gång, gör små steg och få varje del att funka först. Lägg en fil i aktuell mapp, kalla den "text.txt", och använd:

fp = fopen("text.txt", "rb");

Om det funkar, testa då med

const char *filename = "text.txt";
fp = fopen(filename, "rb");

Testa sen med

const std::string filename = "text.txt";
fp = fopen(filename.c_str(), "rb");

Och funkar det så kör du med
const std::string filename = clientPackage.getMessage();
fp = fopen(filename.c_str(), "rb");

Och då kan du lika gärna gå över till

fp = fopen(clientPackage.getMessage().c_str(), "rb");


Sen ser den här raden:
const char* systemMessage = ("start " + clientPackage.getMessage()).c_str();
Väldigt fel ut. Använd en vanlig string, och använd c_str() efteråt.


Svara

Sv:Problem med ShellExecute

Postades av 2008-06-25 13:31:42 - Martin Adrian

Överhuvudtaget skall man inte blanda string och char på det sättet som du gör. Håll dig till string och konvertera till char* så sent som möjligt.

c_str() returnerar en temporär pekare som (i teorin) inte gäller längre än till nästa semikolon.

följande kod är alltså "undefined behaviour"

const char* filename = (clientPackage.getMessage()).c_str();
fp = fopen(filename, "rb");

filename kan peka på vad som helst vid anropet av fopen. I praktiken fungerar det dock med de flesta std::string implementationer eftersom c_str där returnerar en pekare till en intern buffert.

Som Niklas skriver lär följande rad inte fungera.

const char* systemMessage = ("start " + clientPackage.getMessage()).c_str();

("start " + clientPackage.getMessage())

skapar en ny temporär sträng som försvinner vid semikolonet. systemMessage pekar alltså på något minne där den temporära strängen låg tidigare. Vad som ligger där när du använder systemMessage är osäkert.


Svara

Sv: Problem med ShellExecute

Postades av 2008-06-25 13:56:28 - Fredrik Hofflander

Grymt, nu funkar det med koden:

FILE* fp = NULL;
string filename = clientPackage.getMessage();
fp = fopen(filename.c_str(), "rb");
if( fp != NULL )
{
fclose( fp );
//FILE EXIST
string systemMessage = "start " + clientPackage.getMessage();
system (systemMessage.c_str());
}else{
//FILE DOESN´T EXIST
cout << "File doesn´t exist" << endl;
}

Det är en viss omställning att gå från java till c++ vill jag säga, lättare när man inte behöver bry sig om annat än String.

Är det bättre att använda fstream istället för fopen, varför?


Svara

Sv:Problem med ShellExecute

Postades av 2008-06-25 15:49:44 - Niklas Jansson

Grundprincipen är att du bör låta bli gamla C-grejer. Det som ligger i headerfiler som börjar med "c" är såna.

Alltså <cstdlib> <cstdio> osv. är dåliga funktioner, och ersättare finns i C++-versioner. Observera att <cstdlib> osv ibland (felaktigt) skrivs som <stdlib.h>. (Det är korrekt i C men inte i C++).

De tre vanligaste ersättningarna är:
1. char* till string
2. olika filer och i/o till strömmar. cin/cout/fstream istället för scanf, printf, fopen.
3. arrayer till vector:er, (int apa[6] till std::vector<int> apa).

I just det här fallet är ju själva filströmmen tämligen meningslös, så det spelar ingen större roll hur du gör, men det är alltid snyggare att köra med C++-versioner från början.


Svara

Nyligen

  • 19:38 Rekommendera något intressant
  • 19:13 Международная перевозка грузов
  • 00:01 DL Van Tuning | Exclusive Body Kit
  • 12:08 Indian casino
  • 04:14 Vad finns det för kratomalternativ
  • 14:16 Indian online casino
  • 14:15 Indian online casino
  • 08:28 Butiksskyltar: Hur upplever utbude

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 869
27 965
271 770
481
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies