Шаг 330 - Еще про определение текущего каталога

 
От: Anton "dmde@mail.primorye.ru"
Кому: "kaev@yandex.ru"
Тема: Может кому поможет
Дата: 22 марта 2001 г. 7:00

Привет Артем. Пишу прогу на С и столкнулся с такой проблемой: Как узнать имя каталога, из которого запущен exe ?

Есть простая функция GetCurrentDirectiry(), но есть случаи когда она не срабатывает. Например, если программа запускается через ярлык и в ярлыке не проставлен рабочий каталог. А такое может случиться. Я нашел способ как это обойти /*перехожу с VB на VC, а в VB это просто свойсто объекта App*/ Возможно алгоритм не оптимален.

// execDlg.cpp : implementation file
//

#include "stdafx.h"
#include "tlhelp32.h"
CString DirName();

void CExecDlg::OnButton1() 
{
	m_List1.ResetContent(); 
	CString str="";
	str=DirName();
	m_List1.AddString(str);
}

CString DirNameIt(char* exepath)
{
	char *pdest;
	char string2[255]="";
	int result;
	int  ch = '\\'; // символ разделения пути
	pdest = strrchr( exepath, ch ); // ищем
	if( pdest != NULL )
	{
		// если нашли, то берем только каталог.
		result = pdest - exepath ;
		strncpy( string2, exepath, result ); 
	}
	else
		strcpy (string2, "Critical Error");
	return string2;
}

CString DirName()
{
	// Позаимствовал из шагов про сканирование процессов
	CString string="";
	HANDLE hSnap;
	hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (hSnap == NULL) 
	{
		string =  "Error Load ToolHelp";
	}
	PROCESSENTRY32 proc;
	if (Process32First(hSnap, &proc))
	{
		// если ID текущего процесса совпадет с ID сканируемого
		if (GetCurrentProcessId() == proc.th32ProcessID )
			string = DirNameIt(proc.szExeFile);   

		while (Process32Next(hSnap, &proc)) 
		{
			if (GetCurrentProcessId()==proc.th32ProcessID)
				string = DirNameIt(proc.szExeFile);     
		}
	}
	return string;
}

С уважением. Антон.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 21.04.2001