Čtení souboru v "Program Files" – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Čtení souboru v "Program Files" – C / C++ – Fórum – Programujte.comČtení souboru v "Program Files" – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
ProXicT0
Návštěvník
13. 3. 2014   #1
-
0
-

Zdravím, 

snažím se vytvořit program, který se spustí a uloží své nastavení do externího souboru. Složka s programem je v "Program Files" V nastavení je i možnost spustit s OS (Run v registrech). Po té, co se program spustí, má přečíst externí soubor, kde je veškeré nastavení. A zde je problém. Když se program spustí se systémem, tak nemůže přečíst soubor s nastavením.

if(!(file = fopen("data.cfg", "rt")))
		{
			MessageBox(hwnd, "Could not open config file", "ERROR", MB_OK);
		}
		else
		{
			fgets(ReadLine, 20, file);
			sscanf(ReadLine, "#KEYSTROKE %s", &ReadChar);

			fgets(ReadLine2, 20, file);
			sscanf(ReadLine2, "#STARTUP %s", &ReadChar2);

			fgets(ReadLine3, 20, file);
			sscanf(ReadLine3, "#CTRL %s", &ReadChar3);

			fclose(file);
		}

Zde se snažím přečíst soubor s nastavením. Když je program třeba na ploše, tak nemá problém a soubor přečte, jakmile ho ale dám do program files, tak číst nemůže a ani zapisovat. Zkoušel jsem programu nastavit, aby se spouštěl s administrátorskými právy, to sice mohl zapisovat a číst, ale zase se nespustil s OS z registrů.

file = fopen("data.cfg", "wt");
			char *SaveToFile = new char[20];
			sprintf(SaveToFile, "%s %s", "#KEYSTROKE", &KeyStroke);
			fputs(SaveToFile, file);

Zde se zapisuje do souboru.
Už jsem zkusil vše, co mě napadlo, ale nedospěl jsem k ničemu použitelnému. Jako úplně záložní řešení mám vytvořit další exe soubor, který by se spouštěl se systémem a spouštěl by ten druhý program s admin právy.
Jestli vás něco napadne, tak bych byl moc rád.
Nebo jestli někdo ví, jak ukládat nastavení (nebo třeba bitmapy, zvuky atd...) přímo do exe souboru, tak bych byl ještě více nadšen :) Předem díky ;-)

Nahlásit jako SPAM
IP: 77.240.98.–
ProXicT0
Návštěvník
13. 3. 2014   #2
-
0
-

Ještě pro úplnost sem dám zápis do registrů:

if(state == BST_CHECKED)
			{
				fputs("\n#STARTUP TRUE", file);
				
				TCHAR szPath[MAX_PATH];
				GetModuleFileName(NULL, szPath, MAX_PATH); //Cesta k procesu tohoto programu...
				HKEY newValue;
				RegOpenKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", &newValue);
				RegSetValueEx(newValue, "MyDesktop", 0, REG_SZ, (LPBYTE)szPath, sizeof(szPath));
				RegCloseKey(newValue);
			}
			if(state == BST_UNCHECKED)
			{
				fputs("\n#STARTUP FALSE", file);
				
				HKEY hKey1;
				RegOpenKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", &hKey1);
				RegDeleteValue(hKey1, "MyDesktop");
				RegCloseKey(hKey1);
			}
Nahlásit jako SPAM
IP: 77.240.98.–
Kit+15
Guru
13. 3. 2014   #3
-
0
-

#2 ProXicT
Co když adresář "Program Files" neexistuje nebo do něj nemáš právo zápisu?

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ProXicT0
Návštěvník
13. 3. 2014   #4
-
0
-

#3 Kit
Adresářem program files myslím systémovou složku "Program Files(x86)" - v ní je pak moje složka a v ní jsou soubory.

Nahlásit jako SPAM
IP: 77.240.98.–
Kit+15
Guru
13. 3. 2014   #5
-
0
-

#4 ProXicT
Takovou složku na disku nemám, proto se divím, že do ní chceš ukládat. Proč neukládáš jako ostatní programátoři data do uživatelského adresáře?

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ProXicT0
Návštěvník
13. 3. 2014   #6
-
0
-

#5 Kit
Veškeré programy se instalují do složky "Program Files" pro 64bit a "Program Files(x86)" pro 32bit...
Nevím, jaký uživatelský adresář máš na mysli.

Nahlásit jako SPAM
IP: 77.240.98.–
Kit+15
Guru
13. 3. 2014   #7
-
0
-

#6 ProXicT
Mám na mysli adresář s uživatelským profilem. Je v něm například podadresář Dokumenty, ukládají se do něj e-maily, rozložení ikon na ploše, konfigurační soubory programů, prostě vše, co patří uživateli.

Složku "Program Files" opravdu na disku nemám. To vím naprosto přesně. K ničemu ji nepotřebuji.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ProXicT0
Návštěvník
13. 3. 2014   #8
-
0
-

#7 Kit
Ok, zkusím to do té uživatelské složky, díky ;)

Nahlásit jako SPAM
IP: 77.240.98.–
ProXicT0
Návštěvník
13. 3. 2014   #9
-
0
-

#7 Kit
Tak ani v té uživatelské složce to nejde, když to zapnu manuálně, tak to běží jak má, ale když se to má zapnout samo, vždy to uvízne v této podmínce: 

if(!(file = fopen("data.cfg", "rt")))
{
	MessageBox(hwnd, "Could not open config file", "ERROR", MB_OK);
}
Nahlásit jako SPAM
IP: 77.240.98.–
KIIV
~ Moderátor
+43
God of flame
13. 3. 2014   #10
-
0
-

#9 ProXicT
mozna proto, ze kdyz se pouzije jen nazev souboru, tak to zkousi otevrit v miste spusteni programu...

Nahlásit jako SPAM
IP: 94.113.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ProXicT0
Návštěvník
13. 3. 2014   #11
-
0
-

#10 KIIV
Ten soubor je přímo vedle exáče.

Nahlásit jako SPAM
IP: 77.240.98.–
KIIV
~ Moderátor
+43
God of flame
13. 3. 2014   #12
-
0
-

to neznamena, ze ho exac uvidi, pokud ho spustis z kteryhokoliv jinyho adresare

Nahlásit jako SPAM
IP: 94.113.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ProXicT0
Návštěvník
14. 3. 2014   #13
-
0
-

#12 KIIV
Ten exáč ho uvidí jenom, když bude ten konfigurační soubor přímo vedle toho exáče, když použiju relativní cestu, ne? Ale ani tak mi to nefunguje, pořád mi to splňuje tu podmínku, že to nemůže otevřít ten soubor.

Nahlásit jako SPAM
IP: 77.240.98.–
ProXicT0
Návštěvník
14. 3. 2014   #14
-
0
-

#12 KIIV
Zkusil jsem tam teď dát absolutní cestu k souboru a i tak ho nemůže otevřít. Je možné, že na to nemá právo, když se spustí "z registrů" se systémem? Protože když ho zapnu manuálně, tak to ten config načte v pohodě.

Nahlásit jako SPAM
IP: 77.240.98.–
KIIV
~ Moderátor
+43
God of flame
14. 3. 2014   #15
-
+1
-
Zajímavé

skoda, ze to c/c++ nema nic, jak by se dalo zjistit, proc to nefunguje... </irony>

a ted - nezalezi na tom kde je soubor a exac, zalezi na pracovnim adresari (a ten je pri rucnim spusteni obvykle ve stejnem adresari jako exe, ale z registru to bude otevreny kdo vi kde)

jde napriklad pouzit getcwd

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Radek Chalupa
~ Redaktor
+1
Super člen
14. 3. 2014   #16
-
0
-

Pokud použiješ souborové funkce Windows, zjistíš kde je chyba. Např. nějak takhle:

HANDLE h = CreateFile(L"cesta_k_souboru", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if (h == INVALID_HANDLE_VALUE)
{
	DWORD chyba = GetLastError();
	MessageBox(NULL, _com_error(HRESULT_FROM_WIN32(chyba)).ErrorMessage(), L"chyba", MB_ICONERROR);
}

Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz
 

Nahlásit jako SPAM
IP: 89.177.51.–
ProXicT0
Návštěvník
14. 3. 2014   #17
-
0
-

#16 Radek Chalupa
 

TCHAR szPath[MAX_PATH];
		GetCurrentDirectory(MAX_PATH, szPath); //Cesta k tomuto programu...
		char filepath[MAX_PATH];
		sprintf(filepath, "%s%s", szPath, "\\data.cfg");
		if(CreateFile(filepath, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL) == INVALID_HANDLE_VALUE)
		{
			DWORD chyba = GetLastError();
			MessageBox(NULL, _com_error(HRESULT_FROM_WIN32(chyba)).ErrorMessage(), "chyba", MB_ICONERROR);
		}

Takto mi to hází tento error:

Připojen obrázek.

Nahlásit jako SPAM
IP: 77.240.98.–
Řešení
Radek Chalupa
~ Redaktor
+1
Super člen
14. 3. 2014   #18
-
0
-
Vyřešeno Nejlepší odpověď

#17 ProXicT
To ale není ta chyba CretaeFile! Spadlo to v debuggeru nejspíš ve funkci sprintf, možná nedostatečná délka szPath. V NTFS je max. možná délka plné cesty 32768 - tuhle hodnotu samozřejmě nemohu garantovat (někde jsem nalezl), ale rozhodně MAX_PATH je málo, MAX_PATH je totiž max. délka jedné složky plné cesty (tj. např jméno souboru nebo adresáře).

A pokud chceš cestu která je v každém případě "vedle" exáče, GetCurrentDirectory ti to negarantuje. Můžeš to zjistit např. takhle:

wchar_t sz_cesta[_MAX_DELKA_CESTY];
GetModuleFileName(NULL, sz_cesta, sizeof(sz_cesta) / sizeof(wchar_t));
PathRemoveFileSpec(sz_cesta);

// a pak k sz_cesta jen přidat jméno toho souboru

Radek Chalupa 
- vývoj software na zakázku 
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC) 
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 89.177.51.–
ProXicT0
Návštěvník
14. 3. 2014   #19
-
0
-

#18 Radek Chalupa
 Toto hází pořád stejný error:

if(CreateFile("data.cfg", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL) == INVALID_HANDLE_VALUE)
		{
			DWORD chyba = GetLastError();
			MessageBox(NULL, _com_error(HRESULT_FROM_WIN32(chyba)).ErrorMessage(), "ERROR", MB_ICONERROR);
		}
Nahlásit jako SPAM
IP: 77.240.98.–
ProXicT0
Návštěvník
14. 3. 2014   #20
-
0
-

#15 KIIV
Tomu nerozumím, takže když to spouštím manuálně, tak se soubor čte z jiného adresáře, než když soubor spouštím pomocí registrů? V registrech je přeci cesta ks ouboru, tak předpokládám, že se soubor otevře ve stejném adresáři, jako při manuálním spuštění (C:\Users\%USER%\Desktop\test\MyDesktop.exe)

Nahlásit jako SPAM
IP: 77.240.98.–
KIIV
~ Moderátor
+43
God of flame
15. 3. 2014   #21
-
+1
-
Zajímavé

#20 ProXicT
good one :)

spusti se to tak maximalne z adresare volajiciho procesu.. takze kdo vi kde - dobry je si to vypsat

Nahlásit jako SPAM
IP: 94.113.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ProXicT0
Návštěvník
15. 3. 2014   #22
-
0
-

Tak už to jede jak má, díky moc za pomoc :) Vážně mi to pomohlo. Vždy jsem si myslel, že GetCurrentDirectory() je podobné jako GetModuleFileName() s tím rozdílem, že neudává název souboru. Tak ještě jednou díky! 

TCHAR fullPath[MAX_PATH];
TCHAR driveLetter[3];
TCHAR directory[MAX_PATH];
TCHAR FinalPath[MAX_PATH];
GetModuleFileName(NULL, fullPath, MAX_PATH);
		
_splitpath(fullPath, driveLetter, directory, NULL, NULL);
sprintf(FinalPath, "%s%s%s",driveLetter, directory, "\data.cfg");

if(!(file = fopen(FinalPath, "rt")))
{
	MessageBox(hwnd, "Could not load config file", "ERROR", MB_OK);
}
Nahlásit jako SPAM
IP: 77.240.98.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 42 hostů

Podobná vlákna

Pc hra a složka INT v Program Files — založil ZAČÁTEČNÍKDE

čtení ze souboru — založil VitPet

Cteni souboru — založil marek321

čtení ze souboru — založil Jakub Vojáček

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý