» »

[VC++] Uporaba INI fajla v isti mapi kot exe ?

[VC++] Uporaba INI fajla v isti mapi kot exe ?

MrStein ::

Živjo!

Kako je najbolje uporabit INI fajl, ki se naj nahaja v isti mapi* kot exe fajl ?

Trenutno sem uprabil nekaj kot :

GetPrivateProfileString(_T("sekcija"),_T("vnos"),_T("defvalue"),buf, sizeof buf ,_T(".\\mojprog.ini"));

Moti me to, MSDN piše, da to šče v WINDOWS mapi, razen če podam absolutno pot.
Jaz pa sem podal relativno pot, pa vseeno ne išče v WINDOWS.
A bo to delalo tako na vse Windows ?

Sem probal tudi metode ala CWinApp::GetProfileString, samo tisto ne najde lokalnega ini fajla. Probal sem :
theApp.m_pszProfileName=_tcsdup(_T(".\\mojprog.ini"));

pa ne "prime".

Hvala!

David
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

Senitel ::

Kaj pa če mu podaš absolutno pot (jo dobiš v main oziroma WinMain)?

Zgodovina sprememb…

  • spremenil: Senitel ()

MrStein ::

Ja, smo tak rešili. Z GetCurrentDirectory.

A je metoda z WinMain boljša ?
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

krho ::

Da, Current dir lahko kaže nekam čisto drugam...
si.Mail odprto-kodni odjemalec elektronske pošte. - http://www.simail.si
Uredite si svojo zbirko filmov, serij in iger - http://xcollect.sf.net

MrStein ::

Aha, kak točno dobim potem pot iz WinMain ?
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

Person ::

Lahko jo dobiš s pomočjo te funkcije:
GetModuleFileName Function
http://msdn.microsoft.com/en-us/library...

Pač ta funkcija ti lahko vrne celotno pot do tvojega exe fajla ... pač moraš zadnji del "\*.exe" odstranit.
Pač s pomočjo funkcije, ki poišče, kje se zadnji "\" nahajaja v vrnjenem stringu ...

PS: V C# pa mislim da obstaja še lažji način, pač da direktno dobiš pot brez dodatnega imena tvoje exe datoteke.

LP A
Let's make something useful!

Senitel ::

Tretji parameter v WinMain je v bistvu string s potko do exe.

Zgodovina sprememb…

  • spremenil: Senitel ()

MrStein ::

Pač s pomočjo funkcije, ki poišče, kje se zadnji "\" nahajaja v vrnjenem stringu ...

Misliš "dirname()" ?
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

Person ::

Tole sem jaz včasih uporabljal:

void GetAppDirectory( TCHAR* szAppDirectory )
{
TCHAR szAppPath[MAX_PATH] = _T("");

GetModuleFileName(0, szAppPath, sizeof(szAppPath) - 1);
_tcsncpy(szAppDirectory, szAppPath, _tcsrchr(szAppPath, '\\') - szAppPath);
szAppDirectory[_tcslen(szAppDirectory)] = '\0';

return;
}

Verjetno se da kaj optimizirati ... (pač da namesto szAppDirectory uporabiš kar szAppPath in tako delaš samo z eno spremenljivko).

Pa verjetno je vrstica s kodo szAppDirectory[_tcslen(szAppDirectory)] = '\0'; čisto nepotrebna. No pa sej boš znal.

@Senitel:
Hm, a pa je vedno tisti string v WinMain absolutna pot?
Po moje, če iz ukazne vrstice poženeš recimo: program.exe -neko_stikalo
ti po moje točno to vrne ...
Let's make something useful!

Senitel ::

V bistvu ja, Person ima prav (moral preverit). Argument cmdline bo samo "-neko_stikalo", celo brez samega programa.
Tako da dejansko bo treba naredit tako kot je postal Person. GetCommandLine, ki je bila moja druga varianta ima isti problem kot GetCurrentDirectory.

MrStein ::

Mimogrede: A ekvivalent dirname() sploh ne obstaja na Win ?
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

Person ::

V C# obstaja tole: Application.StartupPath + "\\settings.ini"

Za C++ pa kolikor jaz poznam edino na zgoraj opisan način.

LP
Let's make something useful!

Person ::

Torej takole nekako bi naj C++ ekvivalent izgledal ;)

//-----------------------------------------------------------------------------
// Datoteka: GetAppStartupPath.cpp
//
// Opis: Get application startup path
//
// Copyright (c) 1999-2008 pDEV. All rights reserved!
//-----------------------------------------------------------------------------
#define _CRT_SECURE_NO_WARNINGS

#include <tchar.h>
#include <windows.h>

void GetAppStartupPath( TCHAR *szAppStartupPath )
{
TCHAR szModuleFileName[MAX_PATH] = _T("");
GetModuleFileName(0, szModuleFileName, MAX_PATH - 1);
_tcsncpy(szAppStartupPath, szModuleFileName, _tcsrchr(szModuleFileName, '\\') - szModuleFileName + 1);
}

int _tmain(int argc, TCHAR *argv[], TCHAR*envp[])
{
TCHAR szAppStartupPath[MAX_PATH] = _T("");
GetAppStartupPath(szAppStartupPath);

MessageBox(0, szAppStartupPath, "GetAppStartupPath DEMO", MB_OK);
}


PS: Podarim kodo ostalim ;)
Let's make something useful!

Zgodovina sprememb…

  • spremenil: Person ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Windows 10 z reklamami tudi v Raziskovalcu (strani: 1 2 3 )

Oddelek: Novice / Operacijski sistemi
14339896 (33460) D3m
»

C# in servisi

Oddelek: Programiranje
71088 (648) mihies
»

Apache - localhost JA, IP naslov NE

Oddelek: Omrežja in internet
186590 (6449) ManDriver
»

[VC++] Napaka pri prevajanju

Oddelek: Programiranje
141676 (1417) Jean-Paul
»

[C/C++] Branje sektorjev

Oddelek: Programiranje
51272 (1120) yeti

Več podobnih tem