newb vraagje

  • Onderwerp starter Onderwerp starter rdb01
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

rdb01

Nieuwe gebruiker
Lid geworden
2 jan 2007
Berichten
3
Ik heb ervaring met talen als C#, VB.Net, javascript, actionscript, beetje php etc , maar ken niets van C++. Nu moet ik wel een kleine aanpassing maken aan een bestaande C++ applicatie, en dat wil maar niet lukken. Iemand die zo vriendelijk wil zijn me te helpen bij volgend probleem (en eventueel wat uitleg over hoe en waarom?)?

Ik zou het path van de application data map moeten opvragen aan het systeem. Dit kan ik blijkbaar opvragen door middel van de SHGetSpecialFolderPath() functie. Het op te vragen path is dan CSIDL_COMMON_APPDATA.
Nu is het probleem dat deze functie een const char moet teruggeven (wordt zo verwacht in die bestaande applicatie). En dat lijkt me niet te lukken. Ik slaag er maar niet in die waarde naar een const char te casten. Dit lijkt mischien een zeer domme vraag (en dat is ze waarschijnlijk ook wel ;) , maar heb er nu al genoeg tijd mee verloren, en het is waarschijnlijk maar iets van een lijn of 2-3 code... dus ik dacht ik vraag het hier even ;)
 
Ik heb toevallig net een programma geschreven dat dat ook gebruikt:

PHP:
        TCHAR szPath[MAX_PATH];
	bool bRun = true, bKill = false;
	HANDLE hLockFile;

	// Test if we're not already running for this user
	// Get the local appdata folder
	if(SHGetFolderPath(NULL,
					   CSIDL_APPDATA | CSIDL_FLAG_CREATE,
					   NULL,
					   SHGFP_TYPE_CURRENT,
					   szPath) == S_OK
					   &&
					   SetCurrentDirectory(szPath))
	{
		// Try create subdirectory
		if(CreateDirectory(TEXT("IPTray"), NULL)
			|| GetLastError() != ERROR_PATH_NOT_FOUND)
		{
			// Test for the locked file
			if((hLockFile = CreateFile(TEXT("IPTray\\iptray.lock"),
									   GENERIC_WRITE,
									   0,
									   NULL,
									   OPEN_ALWAYS,
									   FILE_ATTRIBUTE_NORMAL,
									   NULL)) != INVALID_HANDLE_VALUE)
			{
				// Use last error to see why it failed
				if(GetLastError() == ERROR_ALREADY_EXISTS)
					bRun = false;
			}else
				bRun = false;
		}
	}
 
ohja en het compileert alleen als je

PHP:
// Set windows version
#define _WIN32_WINNT 0x0500

de windows versie goed instelt (of de shell versie, maar dat weet ik niet zo snel uit me bolle hoof)
 
Bedankt, maar ik zie dat je een tchar gebruikt. Kan ik die zomaar omzetten naar een const char? Ik denk dat ik dat al eens geprobeerd heb, en een compiler fout kreeg.
 
TCHAR is een definitie in windows.h. Als UNICODE als preprocessor directive niet gedefinieerd is, staat het voor char, anders voor de UNICODE versie, dus je hoeft het allleen naar const TCHAR te casten. Overigens begrijp ik niet waarom je deze als const wil definieren.
 
Ik ook niet, maar zo wordt het in die applicatie verwacht (denk ik, want ik krijg als compile error dat ie niet kon casten naar const char). Anyway, ik probeer dit eens uit. Bedankt.
 
die TCHAR szPath[MAX_PATH] kan je iig niet teruggeven in een functie want die wordt op de stack gemaakt en niet in de heap, je zal:
PHP:
const TCHAR* lpszPath = new TCHAR[MAX_PATH];
moeten gebruiken.
Afgezien dat dit nu toch geheugenlekken kan leiden, zal dit denk ik wel compileren.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan